아아 테스트 하는데
왜 조인하는 것인가가 명확히 기억이 안난다
스레드 join은 왜 필요한가?
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 |
---|