들어가기 전
Join이란 뭘까?
여러 개념에서의 Join이 있을 수 있겠지만 이번 글은 Thread 개념에서의 Join이다.
Join에 대해 설명하기 전 다음 쓰레드 생명주기에 대해서 한 번 보고 가면 좋을 것 같다.

당연한 말이겠지만, 멀티스레드를 구현하지 않는다면 Blocked, Waiting, Timed Waiting을 경험 할 수 없을 것이다.
위의 3가지 상태의 경우는 멀티스레드를 통해 한 쓰레드가 동작중이고 그 과정에서 대기, 차단 등을 하는 과정이니..
Join ?
Join의 역할은 아래의 사진과 같이 여러개의 스레드가 존재 할 때, 특정 스레드가 끝날 때 까지 다른 스레드를 대기하게 하는 역할을 한다

이러한 역할을 고려할 때 Join은 세가지 상태중 Wating(대기)에 해당되며, Join을 호출 했을 때 main은 대기상태로 들어가게 되고
특정 스레드가 끝난 이후 main스레드가 다시 실행되는 개념이다.
적용해보기 (Join x)
그럼 Join을 적용하지 않았을 때 부터 Join을 적용하는 단계까지 "멀티스레드를 이용해 1 ~ 100까지의 합 계산하기"로 진행하겠다


다음 코드들을 볼 때 task1과 task2로 스레드를 구분하여 멀티스레드를 구현했고, 지정한 startValue부터 EndValue까지 더한 후 전체 합을 구하도록 잘 짜인 것으로 보인다.

그러나 결과는 다음과 같이 전부 0으로 나오게 된다.
왜그럴까? 그 이유는 task1과 task2가 종료될 때까지 main은 계산이 끝날 때 까지 기다리지 않고 호출한 뒤 값을 바로 불렀기 때문에
main이 종료 된 이후 task1의 결과값인 3775와 task2의 결과값인 1275가 종료 이후 출력 되는 것이다.
그렇다면 이러한 문제를 해결하기 위해선 main스레드를 task1과 task2의 작업이 종료될 때 까지 상태를 waiting(대기) 상태로 바꿔줘야한다.
적용해보기 (Join o)
문제를 해결하기 위해선 waiting 상태로 변경해야 하는 것을 알 수 있고, Join에 대해 처음 설명 해줄 때 역할을 떠올린다면,
이 문제는 Join을 통해 간단하게 해결할 수 있다.


다음은 Join을 적용하여 1 ~ 100까지의 합을 구하는 코드이다.
코드에 대해서 분석하기 전에 결과를 먼저 보면 좋을 것 같다.

Join을 적용하기 전의 코드와 비교하였을 때 main가 task1과 task2를 호출 한 이후 종료까지 무한정 대기 상태로 변경되고,
작업이 완료(terminated) 된 이후 main스레드의 대기상태에서 다시 Runnable상태로 되돌아가며 terminated되며 main스레드까지 종료된다.
"단순히 Join만 추가 된게 아니다"
main의 첫 줄을 비교하면 "throws InterruptedException" 가 추가 된 걸 발견했다면, 굉장히 예리하신 분..
왜 throws InterruptedException을 추가해줘야 할까?
"join을 호출한 스레드는 대상 스레드가 종료될 때까지 Waiting 상태로 대기"한다는 특징 때문이다.
이러한 특징 때문에 대기 중인 스레드는 다른 스레드에 의해 인터럽트될 가능성이 존재하기 때문에 만약 다른 스레드에서 대기중인 스레드를 interrupt() 메서드를 호출한다면 InterruptedException이 발생하게 되고, 이러한 상황에 대비해 throws InterruptedException을 명시해주는 것이다.(try - catch를 써줘도 무관하다)
마무리
현재 팀프로젝트를 진행하면서 개인공부도 진행하다 보니 개발자라는 생각보다 벽이 엄청 높다는 현실과 동시에 전에 한 번 문제를 풀다 배운 것을 써먹어 일반적인 풀이가 아닌 "나만의 풀이"를 통해 풀었냈던 쾌감을 다시 한 번 느낄 수 있을지도? 라는 생각이 근래에 공부할 때 마다 느낀다..
'Java' 카테고리의 다른 글
| [Java] Volatile (1) | 2024.11.19 |
|---|---|
| [Java] reverse() (1) | 2024.11.13 |
| [Java] Record (4) | 2024.11.11 |
| [Java] What is NullPointException? (0) | 2024.09.24 |
| [Java] Linear Search AND Binary Search (2) | 2024.09.03 |
