-
Java Multithreading [3] - Thread#join() : Thread 간을 조정하는 방법Java/Multi Threading 기초 2022. 8. 23. 13:49
Java Multithreading
멀티스레딩의 개념과 Java에서의 활용법을 공부하고 정리하는 시리즈입니다.
3. Thread#join() : Thread 간을 조정하는 방법 중 하나
지금까지 하나의 스레드가 여러 작업을 할 수 있다는 것과 여러 스레드가 동시에 동작할 수 있다는 것을 알게 되었습니다.
그렇다면 여러 스레드가 하나의 작업을 동시에 하는 것도 가능할까요? 결론부터 말하면 가능합니다. 흔히 경쟁조건Race Condition이라고 말하는 상황이죠.
Race Condition에 대해 깊이 들어갈 것은 아니고요(깊이 알지도 못하고...😅), Race Condition의 여러 상황 중 하나를 예로 들어join()
을 설명하고자 합니다.예를 들어 ThreadA와 ThreadB가 동시에 작업중이라고 가정하겠습니다. 이 둘은 같은 목표를 가지고 수행되는 중입니다.
좀 더 자세히 말하면, 하나의 결과물을 리턴하기 위해서 입력값이 들어오면 A가 전처리를 하고, 전처리 결과물을 B가 받아서 후처리를 한 다음에 리턴합니다.
이 과정을 여러 스레드 그룹이 병렬적으로 진행한다고 가정하겠습니다. 1번 그룹, 2번 그룹, 3번 그룹... 10번 그룹.
1번 그룹의 처리가 끝나 결과물이 출력되었습니다. 2번 그룹의 결과물도 출력되었습니다. 그런데 3번 그룹은? 사용자가 입력한 입력값이 너무 커서 A가 전처리를 끝내지 못하고 있습니다. 그 뿐 아니라 A가 작업을 마쳤는지 B가 계속해서 확인하는 중입니다. "A야, 나 일해야 하는데 너 작업 끝났어?"라고 계속해서 물어보는 것이죠. A는 계속 귀찮게 물어보는 B 덕분에 작업속도가 더욱 느려집니다.
작업은 끝나지 않고, 전체 결과물을 받아서 출력할 메인 스레드는 멈춰있습니다. 당연히 프로그램이 종료되지도 않습니다.하나의 작업 때문에 전체 프로그램의 진행이 멈추는 상황은 너무 치명적입니다. 물론 위의 상황에서는 엄청나게 큰 입력값을 입력받았다는 전제 자체도 문제지만(애초에 처리할 수 없는 값은 들어오지 않게 하는게 좋겠죠), 예시의 핵심은 B가 계속해서 작업 완료를 확인하는 바람에 A의 작업이 더욱 더뎌지는 것이었습니다.
차라리 A가 작업하는 동안 B가 조금 쉬고 있으면 더욱 빨라질텐데 말이에요.
해당하는 기능이 바로 join()입니다....(생성 부분 생략)... threadA.join(); threadB.join(); ...(실행(경쟁이 일어날) 부분 생략)...
문제의 작업이 일어날 것으로 예상되는 부분 전에 각 thread에 join() 메서드를 호출하게 되면, 기다리는 thread는 이전 작업의 thread가 결과값을 산출하기 전까지 대기하고 있습니다.
물론 그럼에도 불구하고 예시의 경우처럼 처리하는 값이 엄청 커서 무한정 기다리게 될 수도 있습니다.long waitTime = 2000L; try { threadA.join(waitTime); threadB.join(waitTime) } catch (InterruptedException e) { e.printStackTrace(); }
그렇다면 이런 식으로 최대로 대기할 수 있는 시간을 인자로 넘겨주게 되면 해당 시간만큼만 대기하도록 됩니다.
이전 스레드를 더이상 기다리지 않고 다음 스레드가 동작하는 것이기 때문에, 이전 스레드가 종료될 수 있는 상황이 아니라면(계속해서 연산을 하고 있느라 종료되지 않는 상황이라면) 별도로 interrupt를 해주어야 합니다.'Java > Multi Threading 기초' 카테고리의 다른 글
[Java Multithreading] 메모리 영역 - Stack과 Heap (3) 2022.10.25 [Java Multithreading] 성능 최적화의 두 관점 - 처리량과 http 서버 (0) 2022.10.24 Java Multithreading [4] - 성능 최적화의 두 관점 - 지연 시간 (0) 2022.08.29 Java Multithreading [2] - Java에서 Thread를 종료하는 법 (0) 2022.08.18 Java Multithreading [1] - Java에서 Thread를 생성하는 법 (0) 2022.08.16 Java Multithreading [0] - 스레드와 프로세스의 차이 (0) 2022.08.12