Java

Thread 클래스의 여러 메소드

yanJuicy 2024. 8. 15. 00:30
반응형

Thread 우선순위

Thread.MIN_PRIORITY = 1 ~ Thread.MAX_PRIORITY = 10

디폴트 값은 Thread.NORMAL_PRIORTY = 5

우선순위가 높은 스레드가 CPU 배분을 받을 확률이 높다

public class PriorityThread extends Thread {

    @Override
    public void run() {
        int sum = 0;

        Thread t = Thread.currentThread();
        System.out.println(t + " start");

        for (int i = 0; i < 1000000; i++) {
            sum += i;
        }

        System.out.println(t.getPriority() + " end");   // 스레드의 우선순위 가져옴
    }
}

class PriorityTest {

    public static void main(String[] args) {
        for (int i = Thread.MIN_PRIORITY; i < Thread.MAX_PRIORITY; i++) {
            PriorityThread pt = new PriorityThread();
            pt.setPriority(i);  // 우선순위 할당
            pt.start();
        }
    }
}

결과는 다음과 같다

image

반드시 그런건 아니지만 우선순위가 높은 스레드들이 먼저 끝나는 것을 볼 수 있다

join()

동시에 두 개 이상의 스레드가 실행될 때 다른 스레드의 결과를 참조하여 실행해야 하는 경우 join 메소드를 사용한다

join() 호출한 스레드는 not-runnable 상태가 된다

다른 스레드의 수행이 끝나면 다시 runnable 상태가 된다

image

다음은 1 ~ 50, 51 ~ 100 까지의 합을 구하는 두 개의 스레드 예제다

public class JoinTest extends Thread {

    int start;
    int end;
    int total;

    public JoinTest(int start, int end) {
        this.start = start;
        this.end = end;
    }

    public static void main(String[] args) {
        JoinTest jt1 = new JoinTest(1, 50);
        JoinTest jt2 = new JoinTest(51, 100);

        jt1.start();
        jt2.start();

        try {
            jt1.join();     // main 스레드는 jt1 작업이 끝날 때까지 대기
            jt2.join();     // main 스레드는 jt2 작업이 끝날 때까지 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        int lastTotal = jt1.total + jt2.total;

        System.out.println("jt1.total = " + jt1.total);
        System.out.println("jt2.total = " + jt2.total);

        System.out.println("lastTotal = " + lastTotal);
    }

    @Override
    public void run() {
        for (int i = 0; i <= end; i++) {
            total += i;
        }
    }

}

실행 결과는 다음과 같다

image

main 스레드가 jt1.join(), jt2.join()을 호출해서 다른 스레드의 작업이 끝날 때까지 대기한다

interrupt()

다른 스레드에 예외(InterruptedException)를 발생시키는 interrupt를 보낸다

스레드가 join(), sleep(), wait() 함수에 의해 not-runnable 상태일 때 interrupt() 메소드를 호출하면 다시 runnable 상태가 될 수 있다

반응형

'Java' 카테고리의 다른 글

직렬화  (0) 2024.08.23
멀티 Thread 동기화  (0) 2024.08.22
여러가지 보조 스트림  (0) 2024.08.10
Thread 만들기  (0) 2024.08.08
Wrapper 클래스  (0) 2024.05.21