국비코딩 Mar15 | round robin, synchronized,Thread Pool, Demon Thread
Thread
round robin
thread는 round robin 방식을 사용하기 때문에 먼저 일을 시작했다고 해서 먼저 끝나지 않음.
메모리 쉐어
다른 스레드가 arraylist의 내용을 바꿔버릴 수가 있음 ;; 얘넨 메모리 공유하니까
동기화(Synchronize)를 통해서 다른 스레드가 쓰고 있을 때는 일이 끝날 때까지 들어갈 수 없게 막아줌
ex vector, hash Table 같은 애들이 그 역할을 함
그림그릴때 점선과 실선 차이
실선 : 객체가 클래스가 끝날 때까지 남아있음 (코드블럭 밖에서 객체화를 시킴)
점선 : 사라짐
synchronized(동기화)
먼저 선점한 쪽이 일이 끝나지 않으면 대기하는 것
방법 크게 2가지가 있음
synchronized method는 가게 밖에서 줄 세워 놓음
synchronized block은 method 안에 세워놓음
상황에 맞게 쓰면 됨 !
Thread의 상태값
getState()를 통해 알 수 있다
new: 방금 생긴 상태
runnable : start 한 후에 이동할 수 있는 상태, 부산가는 길에 휴게소에서 기다리고 있는 중
timed_wating : sleep으로 정지시켰을 때 기다리는 상태
blocked : sync로 막혀있는 상태
(구분할 필요는 없)
terminated : 렌트카 반납, 이제 사용할 수 없음
Thread Control
1. sleep() : thread를 일시정지시킨
2. yield() : 양보할 때 바로 들어가야돼, 양보를 못 받는 상황도 생김
확실한 순서 제어를 위한 방법!
3. join() : 다른 thread의 종료를 기다린 후에 실행할 때, 비동기방식의 단점을 커버해줄 수 있음
tmi 답이 0이 나올 때
계산하는 스레드보다 출력하는 스레드가 빨랐기 때문에
비동기방식(동시에 해결해서 일의 순서가 꼬이는)을 커버하기 위해 join같은 blocking 기능이 있는거임
4. wait() : wait은 내가 쉬는거임 그럼 notify는 내가 못해
그래서 notify를 해주고 wait해야함 (불침번 생각)
5. notify() : 일시정지 상태 중인 thread 1개를 실행대기 상태로 바꾼다
6. notify() : 일시정지된 모든 thread를 실행대기 상태로 바꾼
stop은 끝난 후에 사후처리가 전혀안된다, while이 그자리에서 멈춰버리기 때문에 하위동작 진행할 수 없음
stopflag를 활용해서 해
스레드 중지시킬 때
1. stop flag
하나만 멈출 땐 stopflag
2. Forced interrupt
단체로 인터럽트 시킬때
Demon Thread
같이 죽었을면 좋겠을 때 Demon Thread
이건 언제 쓰냐면 감시할 때 (like scheduler)
Thread Pool
빌려주고 다시 반납하는 곳을 pool라고하고
pool 안에 thread가 담겨있다면 -> Thread Pool라고 부름
전략 2가지
1. 일단 오면 만들어줄거야 그리고 반납받고 또 쓸거야
2. 일단 10개는 사놓자, 10개 다 떨어지면 그땐 만들자
줄서는 거 = q
pool 생성하는 법
ExecutorService 객체를 통해 생성 된다.
ex) ExecutorService pool1 = Executors.newCachedThreadPool();
몇개의 스레드를 만들어놔야할까, 스케이트장의 크기 등을 고려해야함
ExecutorService pool2 = Executors.newFixedThreadPool(4);
손님이 올거같으니까 4개 가지고 있었음, 빌려줌, 반납함 -> 4개를 유지하고있는 것임 -> 스레드 하나당 2메가니까 6메가의 메모리를 잡아먹고있는거, 본인 컴퓨터의 cpu에 따라 결정하면 좋음
초기 스레드 수 : 객체 생성시 기본적으로 생성되는 스레드 수
코어 스레드 수 : 최소한으로 유지해야 할 스레드 수
최대 스레드 수 : 스레드 풀에서 관리하는 최대 스레드 수
pool의 작업 생성하는 법
thread pool은 thread가 아니야 그래서 밑의 방법들을 써줘야해
1. runnable 구현 클래스
2. callable 구현 클래스 : 부르면 대답해야함 -> return값이 있음
pool 작업 실행하는 법
execute()는 하다가 마음에 안들면 부산에 놓고와도 돼 -> 리턴타입 : void
submit()은 계속 물어보고 보고해야됨, 마음에 안들어도 어잿든 가져와야돼, 재사용할거 (callable) -> 리턴타입 future
pool 종료 메서드
pool의 thread는 main thread가 종료되더라도 계속 실행상태로 남아있는다 -> 종료 메서드로 따로 꺼줘야함
shutdown() : 손님 나갈대까지 무한정 기다림
shutdownNow() : 손님 죽여버리고 문닫음
awaitTremination() : (30분 유예시간 주고) 시간 내에 처리하면 true를 반환하고, 시간내에 처리못하면 false (손님을 죽임
과정
1. 풀 생성
2.작업요청서 runnable, callable
3. 받을게 있다 submint(get으로 값을 꺼내야함, 보고를 위해 예외가 난 스레드도 가져옴), 없다 execute()