[Java] 8-2강 - 멀티스레드 2 (Multithread method)
4. Multithread Method
0) Thread State
1> NEW : thread를 시작하고 run하지 않은 상태
2> RUNNABLE : run이 준비된 상태
3> BLOCKED : 어떤 이유로 thread가 멈춰있는 상태 (다른 thread가 내가 사용할 resource를 사용하고 있을 때)
4> WAITING : 다른 thread가 notify() 혹은 notifyAll()로 깨워주기를 기다리는 상태 (wait() 혹은 join()으로 WAITING이 된다.)
5> TIMED_WAITING : 시간이 지나면 저절로 깨어나는 경우 (join()이나 sleep()으로 TIMED_WAITING이 된다.)
6> TERINATED : run()이후 thread가 사라지는 경우
1) sleep()
얼마의 시간동안 TIMED_WAITING할지
1> sleep 도중에 interrupt()를 호출하면 InterruptedException이 발생해서, RUNNABLE로 갑자기 변한다.
(필요하다면 try catch로 방지한다.)
2> example
이처럼 1초씩 기다려서 진행할 수 있습니다.
2) interrupt()
다른 thread를 interrupt해서 그 thread의 interrupt 관련 flag를 true로 바꾼다.
1> isinterrupted() : instance thread가 interrupted되었는지 확인
2> interrupted() : [1] 현재 thread가 interrupted되었는지 확인하고 [2] 이 thread의 interrupted state를 false로 바꿔준다.
3> example 1
run 함수는 오랜 loop동안 countdown을 하는데
interrupt함수로 이 loop를 깹니다.
4> example 2
sleep 도중에 interrupt를 실행하면, [1] InterruptedException이 발생하며 [2] 여전히 interrupted state가 false입니다.
그래서 아래 예제는 example1과 달리 끝까지 실행됩니다.
3) yield()
현재 thread는 포기하여 RUNNABLE로 만들고 다음 thread를 우선적으로 실행
4) join()
다른 thread가 종료될 때까지 기다린다. (시간 설정을 할 수 있다.)
=> 어떤 thread를 종료한 뒤에 무언가 진행하고 싶을 때 사용
1> example 1
th1과 th2에 모두 join()을 해서 th1과 th2가 모두 끝나야 그 이후의 시간측정을 진행합니다.
2> example 2
interrupt
join : 100ms만 기다리고 끝나지 않으면 계속 수행하기
(interrupt 전에 아래 코드를 실행하면 usedMemory가 1000을 넘어갈 수도 있어서)
5) Daemon Thread
1> daemon thread : 다른 non-daemon thread가 죽으면, daemon thread는 자동으로 죽습니다.
daemon thread로 만들고 싶은 thread에 [1] start 하기 전에 [2] setDaemon(true) 메소드를 적용합니다.
2> example
3초마다 자동 저장을 하려고 하는데, 5초 이상부터 자동 저장을 허용한다.
6) Thread Synchronization
critical section으로 만들어서 어떤 thread가 들어가 있을 때,
다른 thread가 들어오려고 하면 BLOCKED로 만들어서 접근하지 못하게 한다.