[국비학원 기록/자바] 스레드02. 제어 메서드, join(),interrupt(),wait(),notify(),notifyAll()
my code archive
article thumbnail
반응형

1. multi-threading

  1)여러 thread가 동시에 수행되는 프로그래밍. 여러 작업이 동시에 실행되는 효과.

  2)thread는 각각 자신만의 작업 공간을 가진다. -> context

  3)각 thread 사이에는 공유하는 자원이 있을 수 있다. (자바에서는 static instance)

  4)여러 thread가 자원을 공유하여 작업이 수행되는 경우 (멀티 쓰레드)

    서로 자원을 차지하려는 race condition이 발생할 수 있다.

  5)이렇게 여러 thread가 공유하는 자원 중 경쟁이 발생하는 부분을 critical section이라 한다.

  6)critical section에 대한 동기화를 구현하지 않으면 오류가 발생할 수 있다.

 

2. 스레드 실행 제어 메서드

1)join( )

-다른 스레드의 종료를 기다림.

-동시에 두 개 이상의 Thread가 실행될 때 다른 Thread의 결과를 참조하여 실행해야 하는 경우

 join( )함수를 사용.

-join( )함수를 호출한 Thread가 not-runnable 상태가 됨.

-다른 Thread의 수행이 끝나면 runnable 상태로 돌아옴.

2)intterrupt( )

-다른 Thread에 예외를 발생시키는 interrupt을 보냄.

-Thread가 sleep(시간), wait(),join()함수에 의해 Not runnable 상태일 때

  interrupt()메서드를 호출하면 다시 Runnable 상태가 될 수 있음.

 

3) wait(), notify(), notifyAll()

-리소스가 어떤 조건에서 더 이상 유효하지 않은 경우 리소스를 기다리기 위해

 Thread가 wait()상태가 됨. (Not Runnable)

-wait()상태가 된 Thread는 notify()가 호출될 때까지 기다림.

-유효한 자원이 생기면 notify()가 호출되고 wait()하고 있는 Thread 중 무작위로

  하나의 Thread를 재시작하도록 한다. (Runnable)

-notifyAll()이 호출되는 경우 wait()하고 있는 모든 Thread가 재시작 됨.

 ->유효한 리소스만큼의 Thread만이 수행될 수 있고 자원을 갖지 못한 Thread의 경우 다시 wait()상태로 만듦.

=>자바에서는 notifyAll() 메서드 사용을 권장한다!!!

 

예제1. 학생은 6명, 책은 5권 -> 문제X

예제2. 학생은 6명, 책은 3권 -> 책을 못빌릴 경우에는 wait()을 호출하여 기다림.
책이 반납되어 빌릴 수 있게 될 경우 깨워주는 게 notify()임.

결과

예제3.
책을 못빌릴 경우에는 wait() 호출해서 기다림.
책이 반납되어 빌릴 수 있게 될 경우 깨워주는 게 notifyAll()임.

notify() => 스레드가 1개만 깨어나므로 경우에 따라서는 못깨어나는 경우도 있을 수 있음.
notifyAll() => 모두 다 깨어나게 됨. => 하나만 반납했는데 모두가 빌리는 상황이 되면 다시 문제가 됨.

 

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형