본문 바로가기

JAVA/김영한 자바

thread join

 

아아 테스트 하는데

왜 조인하는 것인가가 명확히 기억이 안난다

 


 

 

스레드 join은 왜 필요한가? 

왜 main이 끝났는데 값이 뒷북 치는가?!

 

main thread의 코드 실행은 sub thread를 기다리지 않는다.

 

[ main] [RUNNABLE] task1.result>> 0

[ main] [RUNNABLE] task2.result>> 0

이미 계산 되었는데 0으로 출력된다.

이게 문제다

 

즉 2초가 지나야 thread-1, thread-2에 있는 코드가 수행되면서

[ thread-1] [RUNNABLE] result>> 1275

[ thread-2] [RUNNABLE] result>> 3775

heap 메모리에 있는 task1, task2의 result의 값을 대입한다.

 

thread-1, thread-2의 계산이 끝날 때까지 main은 기다려야 한다.


스레드 완료 대기:

  • join() 메소드는 스레드가 완료될 때까지 호출한 스레드를 블로킹(대기)합니다. 이는 스레드가 종료될 때까지 기다려야 하는 상황에서 유용합니다.
Thread t1 = new Thread(() -> {
    // 작업 수행
});
t1.start();
try {
    t1.join();  // t1 스레드가 완료될 때까지 대기
} catch (InterruptedException e) {
    e.printStackTrace();
}

 

 

스레드 간 동기화:

  • 여러 스레드가 작업을 수행하고, 이 작업들이 완료된 후에 다음 작업을 진행해야 하는 경우 join()을 사용하여 동기화를 구현할 수 있습니다. 이를 통해 특정 작업이 완료된 후에 후속 작업을 실행할 수 있습니다.
Thread t1 = new Thread(() -> {
    // 작업 1
});
Thread t2 = new Thread(() -> {
    // 작업 2
});

t1.start();
t2.start();

try {
    t1.join();  // t1 스레드가 완료될 때까지 대기
    t2.join();  // t2 스레드가 완료될 때까지 대기
} catch (InterruptedException e) {
    e.printStackTrace();
}

// t1과 t2가 완료된 후에 실행할 작업

 

 

테스트의 일관성 유지:

  • 테스트 환경에서는 여러 스레드가 동시에 작업을 수행할 때, 모든 스레드가 작업을 완료한 후 결과를 검증하는 것이 중요할 수 있습니다. 이 경우 join()을 사용하여 모든 스레드가 완료될 때까지 기다린 후 테스트 결과를 검증할 수 있습니다.
Thread t1 = new Thread(() -> {
    // 테스트 작업
});
Thread t2 = new Thread(() -> {
    // 테스트 작업
});

t1.start();
t2.start();

try {
    t1.join();  // 모든 스레드가 완료될 때까지 대기
    t2.join();  // 모든 스레드가 완료될 때까지 대기
} catch (InterruptedException e) {
    e.printStackTrace();
}

// 모든 스레드가 완료된 후 결과 검증

'JAVA > 김영한 자바' 카테고리의 다른 글

Thread 생성 방법  (0) 2024.08.21