[JAVA] 10강 Thread & Thread Pool

KDH59·2024년 2월 7일
0

[JAVA]

목록 보기
10/13

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 전부 깨우는것

※ 반드시 누군가를 깨우고 쉬어야 한다.

쓰레드는 각각 필요할때 사용하기 때문 데이터를 은근 잡아먹음

요약

  1. Thread 제어를 위한 방법은 여러가지가 있다.

  2. sleep() 은 스스로가 정해진 시간만큼 쉬는 것이다.

  3. yeild() 는 상대에게 실행할 기회를 주는 것이다.

  4. join() 은 특정 스레드의 종료를 기다리는 것이다.

  5. wait() 은 누군가가 notify() 해 줄 때 까지 쉬는 것이다.

Stop flag, interrupt()

  • stop을 사용할 수 있으나 현재는 사용중지를 권고 하고 있다
    stop() method -> 경고 없이 사용 종료가 되기 때문

Stop flag

  • (true false 로 정해짐)

Forced interrupt

-> 문제는 없으나 예외를 발생시킴

Demon Thread

  1. 메인 쓰레드의 영향을 받냐 안받냐의 차이

워크스레드 = 메인스레드가 끝나도 워크 스레드는 계속해서 동작함
메인스레드가 끝나도 내 할 일 할거면 워크 쓰레드 사용

데몬스레드 = 메인스레드가 끝나면 워크스레드가 끝나야 하면 데몬 스레드를 사용

※ 여기 까지가 단일 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 사용

  • void 리턴 값이 없을때
  1. 보고 없이 나혼자 실행하기에 내 마음대로 해도됨

Callable -> Submit

  • return(반환 타입) T
  • 뭔가 반환 하는 값이 필요하면

Submit -> callable 사용

  • Futue 리턴 타입
  • 전송하다
  1. 결과 값을 보고해야되기에 내 마음대로 할 수 없음

Runnable 과 Callable 차이점

  • 리턴값의 유무 차이

Thread pool의 종료 메서드

  • shutdown() : 모두 끝날때 까지 기다린 후 종료
  • shutdownNow() : 닫는다 음 죽어라잉
  • awaitTermination() : 닫는다고 경고 후 닫음 시간 내 처리 : ture 시간내 미처리 : intrrupt 후 false

Thread pool Blocking

  • 리턴 타입이 있는 callable -

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 객체를 끌고와 블로킹하는 방법

profile
[JAVA]

0개의 댓글

관련 채용 정보