오늘은 Java의 Thread 클래스 안에 있는 join 메서드가 어떤 식으로 동작하는지 간단하게 알아봅시다. 아래 예제 프로그램을 실행시켜 봅시다.

 

 

 어떻게 실행이 될까요? worker a가 실행이 끝난 후에, Main 쓰레드가 종료됩니다. 그러면, join() 함수는 특정한 스레드가 종료될 때 까지 기다릴 때 쓴다는 건데, 어떤 식으로 동작하는지는 천천히 뜯어보도록 하겠습니다.

 

 


 a.run()을 호출하였습니다. 그 순간, worker a가 run() 메소드를 호출하면서 돌아갑니다. 대충 그림과 같은 상황입니다.

 

 

 그 다음에, Main 스레드에서는 a.join()을 호출하는데요. 여기서 무슨 일이 일어나는지만 간단하게 봅시다. join을 호출할 때, 매개 변수가 없으면 내부적으로 join(0)을 호출합니다.

 

 

 그러면, 이 안에서 무엇인가를 호출할 텐데요. 저는 인자로 0을 넘겨주었으므로, 1250번째 줄에 있는 if문에 걸려요.

 

 

 isAlive() 함수는 해당 쓰레드 객체가 살아있는지를 나타내는 것입니다. 해당 객체는 어떤 것일까요?

 

 제가 호출한 worker입니다. 그러면 이 친구가 실행이 끝나고 Alive 하지 않을때까지 join() 함수가 실행된다는 소리가 됩니다. 이 함수 안은 wait() 함수와 is_Alive()의 조합으로 이루어져 있는데요. synchorized 블록 안에 있기 때문에, 초록색으로 칠한 부분은, 일단은, Main Thread만 접근할 수 있게 됩니다.

 

 

 그러면 wait가 대체 무엇을 하는 함수인지 알아야 할 건데요. 여기에서는 그냥 간단하게만 설명하겠습니다. wait는, 기본적으로 동기화 블록 내에서 쓸 수 있어요. 스레드를 일시 정지 상태로 만든 다음에, notify나 notifyAll을 통해서 실행 대기 상태로 갈 수 있어요. 물론, 여기서는 시간이 주어졌기 때문에, 주어진 시간이 지난 다음에 실행 대기 상태로 가겠네요.

 

 

 일단 Lock이 없어지면서 wait 상태를 유지해요. 그러면, 다른 쓰레드가 이 때, thread_A 객체에 접근이 가능할 거에요. 여기에서는 Main 스레드만 thread_A에 접근하니까, 그냥 대기만 하다가, 깨어나고, 실행이 될 때, 다시 Lock을 가져오겠네요.

 

 

 wait와 sleep 함수는 나중에 다시 언급해 드리도록 하겠습니다. is_alive() 함수는, a가 실행이 되고 있다면 참이 될 거에요. 그런데 지금은 wait(0)인데, 이건 추후에 다시 언급드리겠습니다. 단순히 0초가 지나고, 실행 대기 상태가 들어가는 게 아닙니다. 그리고 실행이 되면 다시 is_alive()인지 검사할 거에요. 만약에 worker a가 끝났다면, 쓰레드 a는 alive 상태가 아닐 거에요. 그렇기 때문에 while 조건이 걸리지 않아요.

 

 

  고로, 빠져나오는 것입니다. 즉, a.join(); 은 간단하게 말하면, 쓰레드 a가 끝나기 전까지 문장이 끝나지 않는다. 정도로 보시면 좋겠네요. 한 마디로 정리해 봅시다. t1.join();은 무엇인가요? Main 스레드에서 호출했다고 합시다.

 

 

 그러면 t1.join()이 호출된 순간, t1이 끝날 때 까지 t1.join()이 끝나지 않아요. 즉, 쓰레드 t1이 끝난 후에, t1.join(); 문장이 끝납니다. 이 정도 흐름만 이해하면 좋을 듯 싶네요. 다음에 계속 이어서 이야기 해 보겠습니다.