반응형

join()

  • 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다.

 

A라는 쓰레드가 있을 때, B라는 쓰레드가 따로 돌고 있는데,
A가 작업하다보니, B가 작업을 마쳐야(혹은 어떤 작업을 해야)  특정 일을 진행할 수 있을때는,
A는 B가 작업을 다 마칠 때 까지 기다려야한다.
그럴때 사용하는 것이 join()이다.

그런데, 기다리는 시간을 정해주는데, 얼마나 기다릴지를 지정할 수 있다.
그런데 시간을 지정해 주지 않으면 작업이 모두 끝날 때 까지 기다려야한다.

사용법은 sleep()과 유사하다.

try-catch로 감싸 주어야 하는데,
인터럽트가 발생하면 기다리는 것을 멈추게 된다. 그래서 예외처리를 해줘야 한다.

쓰레드 2개 만들어서 돌리다가, 쓰레드1작업이 끝날 때까지 기다리고,
쓰레드 2작업이 끈날 때 까지 기다리는데,
만약에 인터럽트가 발생하면, 기다리는 것을 멈추고 try-catch문을 벗어나서 끝나게 된다.


[Ex13_11]

 

join() - 예시

GC(가비지 컬렉터)코드를 흉내내어 보았다.
GC는 데몬쓰레드다.
데몬 쓰레드는 일반 쓰레드가 하나도 없으면 자동 종료된다.

데몬 쓰레드는 보조작업을 해주는 쓰레드라서 무한루프로 돌아간다.

10초마다 gc()를 수행한다.

하나의 작업코드를 보자.
메모리가 부족한 경우, gc를 깨우고, 메모리를 사용하도록 되어있다.
아무문제 없어보이지만,
잘생각해보자. 뭔가 필요하다.
메모리를 사용하기 전에 join이 필요하다.
 왜냐하면, gc를 깨운다음에 메모리가 생기도록 작업할 시간을 줘야 한다.
깨우고서 바로 메모리를 쓸수 없다. gc가 작업하는 것을 기다려야 한다.
그래서 0.1초를 주었다.

이러한 경우에 join()을 사용한다고 이해하자.

 


 

yield()

  • 남은 시간을 다음 쓰레드에게 양보하고, 자신(현재 쓰레드)은 실행대기 한다.
  • yield()와 interrupt()를 적절히 사용하면, 응답성과 효율을 높일 수 있다.

yeid는 남은 시간을 다음 쓰레드에게 양보하고, 자신(현재 쓰레드)은 실행대기하는 메서드다.

실행하고 있는 쓰레드가 5초라는 시간을 받았는데, 해당 쓰레드가 현재 특별히 할 일이 없거나, 작업할 수 있는 상황이 아니라면,
예를 들어, 5초중에서 3초정도만 쓰고 2초는 양보하고 뒤로가서 줄을 서는 것이 yield()이다.

yeid()는 static메서드라서 자기 자신에게만 사용할 수 있는 메서드이다.

만약에 !stopped가 ture고, !suspended가 false면
suspened는 true라서 일시정지 상태일 것이다.

if문이 false이면 if문을 실행하지 않아서 할일이 없다.
while문은 true이므로 계속 할일없이 while문을 루프하게 된다.

이러한 상태를 busy-wating이라고 한다.(바쁘게 기다림)

차라리 이러느니, 뒷사람에게 양보하는 것이 낫다.


이럴 때, yield를 사용하는 것이다.
else블럭에다가 yield를 넣는 것이다.
그래서 자기자신에게 주어진 시간을 다른 쓰레드에게 양보하는 것이다.

이렇게 yield()와 interrupt()를 적절히 사용하면, 응답성과 효율을 높일 수 있다.

 

사실, suspend()와 stop()코드에도 interrupt()를 넣어야 한다.
왜냐하면, 쓰레드가 바뀐다음에 자고있을 수도 있기 때문이다.

그러면 interrupt()를 적절히 사용하면 응답성이 좋아질 것이다.

그런데 yield()는 OS스케줄러에게 통보하는 것이므로 반드시 yield가 동작한다는 보장이 없다.
스케줄러 마음이다.

 

반응형

'JAVA' 카테고리의 다른 글

wait()과 notify()  (0) 2022.07.27
쓰레드의 동기화  (0) 2022.07.09
suspend(), resume(), stop()  (0) 2022.07.07
sleep(), iterrupt()  (0) 2022.07.01
데몬 쓰레드, 쓰레드의 상태  (0) 2022.06.29