백엔드/Java의 정석

TIL 정리_24

ran4 2022. 3. 11. 23:50

쓰레드의 우선순위

쓰레드는 우선순위(priority)라는 속성(멤버변수)을 가지고있다

작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여 특정 쓰레드가 더 많은 작업시간을 갖게 할 수 있다

 

쓰레드의 우선순위 지정하기

void setPriority(int newPriority) 쓰레드의 우선순위를 지정한 값으로 변경한다

int getPriority() 쓰레드의 우선순위를 반환한다

public static final int MAX_PRIORITY = 10 //최대 우선순위

public static final int MIN_PRIORITY = 1 //최소 우선순위

public static final int NORM_PRIORITY = 5 //보통 우선순위

 

쓰레드 그룹

서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것

모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야 한다

쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 main 쓰레드 그룹에 속한다

자신을 생성한 쓰레드(부모)의 그룹과 우선순위를 상속받는다

쓰레드를 그룹에 포함시키려면 Thread의 생성자를 이용해야한다

ThreadGroup getThreadGroup() 쓰레드 자신이 속한 쓰레드 그룹을 반환한다
void uncaughtException(Thread t, Throwable e) 쓰레드 그룹의 쓰레드가 처리되지 않은
예외에 의해 실행이 종료되었을 때, JVM에 의해 이 메서드가 자동으로 호출된다

 

데몬쓰레드 (Daemon thread)

 

일반쓰레드의 작업을 돕는 보조적인 역할을 수행한다

일반 쓰레드가 모두 종료되면 자동적으로 종료된다

가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다

무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다



boolean isDaemon() - 쓰레드가 데몬 쓰레드인지 확인한다. 데몬쓰레드이면 true를 반환
void setDaemon(boolean on) - 쓰레드를 데몬 쓰레드로 또는 사용자 쓰레드로 변경
매개변수 ontrue로 지정하면 데몬 쓰레드가 된다

*setDaemon(boolean on)은 반드시 start()를 호출하기 전에 실행되어야 한다

그렇지 않으면 IllegalThreadStateException이 발생한다

getAllStackTraces()를 이용하면 실행 중 또는 대기상태인 쓰레드의 호출스택을 출력할 수 있다

 

쓰레드의 상태

상태 설명
NEW 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE 실행 중 또는 실행 가능한 상태
BLOCKED 동기화 블록에 의해서 일시정지된 상태(lock이 풀릴때까지 기다리는 상태)
WAITING,
TIME_WAITING
쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable) 일시정지 상태.
TIMES_WAITING
은 일시정지기간이 지정된 경우를 의미한다
TERMINATED 쓰레드의 작업이 종료된 상태

 

쓰레드의 실행제어

쓰레드 프로그램밍이 어려운 이유는 동기화(synchronization)와 스케줄링(scheduling)때문이다

쓰레드의 실행을 제어할 수 있는 메서드가 제공된다

이들을 활용해서 보다 효율적인 프로그램을 작성할 수 있다

 

쓰레드의 스케줄링과 관련된 메서드

-sleep(long millis) //static 메서드

지정된 시간동안 쓰레드를 멈추게 한다

static void sleep(long millis) //천분의 일초 단위

static void sleep(long millis, int nanos) //천분의 일초 + 나노초

sleep()에 의해 일시정지 상태가 된 쓰레드는 시간이 다 되거나 interrupt()가 호출되면 

InterruptedException가 발생하여 실행대기 상태가 된다 

-> try-catch문으로 예외를 처리해야한다

 

-interrupt(), interrupted()

쓰레드의 작업을 취소한다

대기상태인(WAITING) 쓰레드를 실행대기 상태(RUNNABLE)로 만든다

void interrupt() : 쓰레드의 interrupted 상태를 false에서 true로 변경
boolean isInterrupted() : 쓰레드의 interrupted 상태를 반환
static boolean interrupted() : 현재 쓰레드의 interrupted 상태를 반환 후 false로 변경 

-suspend(), resume(), stop()

쓰레드의 실행을 일시정지, 재개, 완전정지 시킨다.

void suspend() : 쓰레드를 일시정지 시킨다

void resume() : suspend()에 의해 일시정지 된 쓰레드를 실행대기상태로 만든다

void stop() : 쓰레드를 즉시 종료시킨다

-->위 메서드들은 deprecated 되었기에 사용하지 않을것을 권장한다

 

-yield()

남은 시간을 다음 쓰레드에게 양보하고, 자신은(현재 쓰레드) 실행대기한다

yield()interrupt()를 적절히 사용하면, 응답성과 효율을 높일 수 있다

 

-join()

지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다 //다른 쓰레드의 작업을 기다린다

void join() 작업이 모두 끝날 때까지

void join(long millis) 천분의 일초 동안

void join(long millis, int nanos) 천분의 일초+나노초 동안

 

 

'백엔드 > Java의 정석' 카테고리의 다른 글

TIL 정리_26  (0) 2022.03.13
TIL 정리_25  (0) 2022.03.12
TIL 정리_23  (0) 2022.03.10
TIL 정리_22  (0) 2022.03.09
TIL 정리_21  (0) 2022.03.08