쓰레드의 우선순위
쓰레드는 우선순위(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) - 쓰레드를 데몬 쓰레드로 또는 사용자 쓰레드로 변경 매개변수 on을 true로 지정하면 데몬 쓰레드가 된다 |
*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) 천분의 일초+나노초 동안