Spring

국비코딩 Mar15 | round robin, synchronized,Thread Pool, Demon Thread

onnnzeoz 2023. 3. 15. 17:47

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()