Thread State

- getState()를 통해 현재 상태를 알 수 있다.


- workThread.
- 12 : 조건에 만족 할 때 까지 cnt를 계속 증가시켜주는 반복문
- 15 ~ 19 : Thread.sleep은 잠시 멈춰주는 메서드이기 때문에 try-catch문으로 InterruptedException예외 발생시 처리하는 영역을 만들어 주어야 한다. TIMED_WAIT상태를 만들어 준다.

- 11 : work thread를 객체화하여 work thread를 생성시켜줌
- 15 : workthread상태 얻기
- 18 : NEW는 객체 생성상태로 생성상태가 NEW라면 work실행
- 19 : TERMINATED는 실행을 마친 상태로 상태가 TERMINATED가 된다면 break로 반복문 멈춤
- 26 ~ 30 : 크게 의미 있는건 아니고 너무 빠르게 진행 되기 때문에 조금씩 멈추면서 상태를 찍기 위해 sleep을 써주었다.
- 출력 값 :

sleep()
yield()

- yield는 특정 thread에게 제어권을 양보한다.
- Thread.yield() 형식으로 사용한다.

- Thread A와B

- Main Thread
- 18 : ThreadA의 14의 yield를 true로 바꿔 동작하게 해서 Thread.yield 동작
- 19 , 20 : 0.5초 정치 시켰다가 A의 yield는 false로 바꿔 동작을 정지 시키고 B의 yield를 true로 바꿔 B의 Thread.yield 동작
join()
- join()은 다른 thread의 종료를 기다린 후에 실행 할 때 사용한다.

- work thread.
- 12 : 1에서 100까지 더하는 실행문

- 8 : 워크스레드 객체화
- 11 : oper가 계산을 끝낼때까지 기다렸다가 아래 실행
- 11코드가 없으면 워크 스레드가 끝내기 전에 메인 스레드가 아래까지 실행되어 버린다.
wait(), notify(), notifyAll()

- wait() : 내가 쉬는 것
- notify() : 누군가를 깨우는 것
- notifyAll() : 모두를 깨우는 것
- 이 세개의 호출은 synchronized안에서 해야한다.

- 점선은 임시로 호출하는 것
- 실선은 계속 가지고있는 것



- WorkThread에게 할일 WorkObj를 줌
- 출력값
- 번갈아 가면서 일을 할 때 많이 쓴다.
stop flag
- 기본적으로 thread는 run()의 실행 내용이 모두 실행되면 종료 된다.
- 무한 반복문으로 이루어 경우는 강제 종료가 필요하다

- StopFlag 클래스

- StopFlag를 이용한 스레드 정지
- stopflag의 run은 while이 true이므로 무한 반복문이다.
- 메인의 13처럼 stop메서드가 있지만 이는 컴퓨터를 그냥 확 꺼버리는 행위와 똑같으므로 사용하지 않도록한다.
- 14 : setStop을 true로 바꾸면 while문은 false가 되므로 정지가 된다.
interrupt
- 인터럽트란 작동중, 대기중인 쓰레드에 인터럽트(정지) 신호를 보내는 행위.

- Inter 클래스
- while문 정지 자체를 인터럽트로 할때 트라이캐치문 안으로 넣는다

- 11 : 강제 인터럽트를 발생 시켜서 inter가 트라이에서 캐치로 넘어가면서 정지됨

- 23 : 메인에서 강제 인터럽트를 발생시키면 if문이 성립되어 정지
Demon Thread
- Demon Thread는 main thread 작업을 돕는 보조적인 역할을 한다
- work thread와 마찬가지로 main thread에 의해서 생성된다

- 하지만 이것처럼 life cycle이 work thread는 main끝나고도 계속 진행되지만 Demon은 main과 함께 끝난다.

- DemonThread

- 8 : 이 과정을 통해 워크스레드가 데몬스레드가 된다.
Thread Group
- thread는 name을 통해서 관리한다
- 하지만 thread수가 너무 많을 경우 group을 통해 관리 할 수 있다.
- thread는 지정하지 않을 경우 자동적으로 Main Group에 들어가있다.

- 13 : 스레드 그룹이름 얻기

- 11 : thread 그룹 생성 방법
- ThreadGroup 객체를 통해 Thread Group이 생성된다
- 생성시 부모 스레드 그룹을 지정하지 않으면 현재 스레드가 속한 그룹의 하위그룹이 된다.


- ThreadGroup에 대해 단체 명령을 내릴 수 있다.
- 대표적으로 interrupt()를 통해 해당 그룹의 스레드를 모두 정지 시킬수 있다.