Threads

장석빈·2022년 6월 7일
0

Process

-프로세스는 자신만의 메모리 공간을 포함한 완벽한 자신만의 실행 환경을 갖고 있다.

-프로세스는 프로그램이나 애플리케이션과 비슷한 말 같지만 한 개의 애플리케이션이 여러 개의 포르세스로 이루어질 수 있다.

-대부분의 OS는 파이프나 소켓같은 내부 프로세스 통신(Inner Process Communication, IPC)을 지원한다.

-대부분의 자바 가상 머신(JVM)은 싱글 프로세스로 동작한다.

-자바 애플리케이션은 추가적인 프로세스를 만들 수 있다. 멀티 프로세스 애플리케이션은 이 과정의 범위가 아니다.

Threads

-스레드는 lightweight process(경량 프로세스)로 불리기도 한다.

-프로세스와 스레드는 모두 실행환경을 제공하지만 스레드를 만드는 것이 프로세스를 만드는 것보다 더 적은 자원을 필요로 한다.

-스레드들은 프로세스 안에 존재하고 모든 프로세스는 적어도 한 개의 스레드를 갖고 있다. 스레드들은 메모리나 파일 같은 프로세스의 자원을 공유한다. 이것은 효율적이지만 잠재적으로 스레드들 간의 통신 문제를 야기한다.

-모든 자바 애플리케이션은 main 스레드라는 한 스레드에서 시작한다. main 스레드는 추가적인 스레드들을 만들 수 있다.

threads를 만드는 두 가지 방법

1. Thread 클래스를 extends

class SomeThread extends Thread{
	@Override
    public void run(){
    	//스레드로 동작한 코드
    }
}
Thread t = new SomeThread();
t.start()

2.Runnable 오브젝트를 Thread의 컨스트럭터에 넣어서 생성

class SomeRunnable implements Runnable{
	@Override
    public void run(){
    	//스레드로 동작할 코드
    }
}
Runnable r = new SomeRunnable();
Thread t = new Thread(r);
t.start();

#두 가지 방식 중,,,

다음의 이유로 2번 방법이 더 일반적이다.
1.Runnable 오브젝트를 사용하면 Thread 클래스가 아닌 다른 클래스를 상속해서 스레드를 만들 수 있다.
2.태스크 클래스가 Thread 클래스를 상속할 필요없이, 태스크와 Thread 오브젝트를 분리할 수 있다.

ex1)방법1

package threads;

class TimerThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 4; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {

            }
        }
    }
}

public class TestTread {
    public static void main(String[] args) {
        TimerThread th = new TimerThread();
        th.start();
    }
}

ex2)방법2

package threads;

import java.util.Timer;

class TimerRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 4; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {

            }
        }
    }
}

public class TestRunnable {
    public static void main(String[] args) {
        Runnable r = new TimerRunnable();
        Thread th = new Thread(new TimerRunnable());
        th.start();
    }
}

ex3)lambda expression

public class TestRunnableUsingLambdaExpression {
    public static void main(String[] args) {
        new Thread(() -> {
            for (int i = 0; i < 4; i++) {
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {

                }
            }
        }).start();
    }
}

ex4)method reference

public class TestRunnableUsingMethodReference {
    public static void main(String[] args) {
        new Thread(new TestRunnableUsingMethodReference()::doSomeThing).start();
    }

    private void doSomeThing() {
        for (int i = 0; i < 4; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {

            }
        }
    }
}
profile
회피형 인간의 개과천선기

0개의 댓글