Thread State

NEW 시작하기전
RUNNABLE 언제든 시작 가능한 상태
TIMED_WATING 주어진 시간 동안 기다리는 상태 (Sellp 과 비슷한 개념)

Thread control
thread의 순서 제어를 위한 메서드들
sleep
- 주어진 시간(milliseconds) 동안 thread를 일시 정시 시킨다.
- Thread.sleep() 형식
yield()
- 특정 스레드에게 제어 권을 양보 한다 -> 기회를 주는 방식(단. 즉각반응 해야됨)
- Thread.yield() 형식
※ 스레드 세상의 양보는 기회를 줬을때 뜸드리면 내가 기회를 다시 박탈한다
join
- 한명이 기다리고 한명이 합류 할 수 있도록
- 이러한 것을 block으로 불리기도 한다.
※
Wait(),notify(),notifyall()
- wait() 은 내가 쉬는 것이고, notify()는 누군가를 깨우는 것, notifyAll 전부 깨우는것
※ 반드시 누군가를 깨우고 쉬어야 한다.

쓰레드는 각각 필요할때 사용하기 때문 데이터를 은근 잡아먹음
요약
-
Thread 제어를 위한 방법은 여러가지가 있다.
-
sleep() 은 스스로가 정해진 시간만큼 쉬는 것이다.
-
yeild() 는 상대에게 실행할 기회를 주는 것이다.
-
join() 은 특정 스레드의 종료를 기다리는 것이다.
-
wait() 은 누군가가 notify() 해 줄 때 까지 쉬는 것이다.
Stop flag, interrupt()
- stop을 사용할 수 있으나 현재는 사용중지를 권고 하고 있다
stop() method -> 경고 없이 사용 종료가 되기 때문
Stop flag
Forced interrupt
-> 문제는 없으나 예외를 발생시킴
Demon Thread
- 메인 쓰레드의 영향을 받냐 안받냐의 차이
워크스레드 = 메인스레드가 끝나도 워크 스레드는 계속해서 동작함
메인스레드가 끝나도 내 할 일 할거면 워크 쓰레드 사용
데몬스레드 = 메인스레드가 끝나면 워크스레드가 끝나야 하면 데몬 스레드를 사용
※ 여기 까지가 단일 Thread 로 불리기도 함
Thread pool
pool -> 저장소
Thread pool 구조
순서에 따라 빌려주고 사용 후 돌려 받는다 -> Job Queue
Thread 생성 시
-ExecutorSerice 객체를 통해 초기 / 코어 / 최대 스레드수를 명시
메인 쓰레드랑 같은 개수를 유지 하는 게 가장 일반적이다.
ExecutorService 스레드 풀의 매소드
newCachedThreadPool(); 특징
- 사용법 ; 아무것도 없이 있다가 요청이 있으면 그때 만든다.
- 반납받은 스레드가 있으면 빌려준다
- 반납받은 스레드가 60초간 놀고 있으면 버린다.
newFixedThreadPool(); 특징
- 초기에 n 개의 스레드를 구비하고 있는다.
- 60초간 사용하지 않으면 버리지만 n개 만큼은 가지고 있는다.
- 단 반응 속도가 느리다.
Thread pool 요청 시 사용법
- Thread Pool 의 작업은 Runnable 과 Callable 로 생성 한다.
Runnable -> execute / submit(특정한경우)
- return(반환 타입) void
- 뭔가 반환 하는 값이 필요 없으면
Execute -> Runnable 사용
- 보고 없이 나혼자 실행하기에 내 마음대로 해도됨
Callable -> Submit
- return(반환 타입) T
- 뭔가 반환 하는 값이 필요하면
Submit -> callable 사용
- 결과 값을 보고해야되기에 내 마음대로 할 수 없음
Runnable 과 Callable 차이점
Thread pool의 종료 메서드

- shutdown() : 모두 끝날때 까지 기다린 후 종료
- shutdownNow() : 닫는다 음 죽어라잉
- awaitTermination() : 닫는다고 경고 후 닫음 시간 내 처리 : ture 시간내 미처리 : intrrupt 후 false
Thread pool Blocking
Future 객체에서 get() 매서드를 사용하면 답이 나올때 가지 다른 스레드가 움직이지 못한다.
blocking 할려면 반드시 future 객체가 필요하다
callable의 blocking 사용하는 법
callable 은 리턴 값이 있기에 submit 매서드를 이용
submimt 매서드를 사용해서 Future<반환타입> 객체에서 get매서드를 사용하여 실행이 끝날때 까지 다른 스레드가 움직이지 못하게 blocking 한다.
Runnable의 blocking 사용하는 법
Runnable 은 리턴 값이 없기에 Execute 메서드를 이용하나
Runnable 은 반환 하는 값이 없지만 Blocking 기능을 이용하기 위해 예외적(특정한 상황)으로 Submit() 사용 할 수 있게 해주었다
반환 타입의 void 이므로 반환 타입을 모르기 때문 어떤 규격으로 특정할수 없어 <?> 사용하며
fu.get(); 를 사용하는 이유는 실제로 반환받는건 없지만 블로킹을 위해 사용함
즉 Runnable에서 특정한 상황(블로킹 기능이 필요할때 ) submit()을 사용하여 Future 객체를 끌고와 블로킹하는 방법