대몬 스레드(daemon thread)
- 일반(non-demon-thread)의 작업을 돕는 보조적인 역할을 수행(스레드의 종류 : 일반,데몬)
- 일반 스레드가 모두 종료되면 자동적으로 종료된다.
- 가비지 컬렉터, 자동저장,화면 자동갱신 등에 사용된다.
- 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.
public void run()
while(true){ //일반 스레드가 언제 작업을 마칠지 모르니 무한루프로 작성
try{
Thread.sleep(3*1000); //3초마다
} catch(InterruptedException e){}
//autoSave의 값이 true이면 autoSave()를 호출한다.
if(autoSave){
autoSave();
}
}
boolean isDaemon() - 스레드가 데몬 스레드인지 확인한다. 데몬 스레드이면 true를 반환
void setDaemon(boolean on) - 스레드를 데몬 스레드로 또는 사용자 스레드로 변경
매개변수 on을 true로 지정하면 데몬 스레드가 된다.
* setDaemon(boolean on)은 반드시 start()를 호출하기 전에 실행되어야 한다.
그렇지 않으면 IllegalThreadStateException이 발생한다.
static boolean autoSave = false;
public static void main(String[] args) {
Thread t = new Thread(new Ex13_7()); //Thread(Runnable r)
//스레드 구현방법 Thread를 상속받거나 Runnable인터페이스를 구현
t.setDaemon(true); // 이 부분이 없으면 종료되지 않는다.
t.start();
for(int i=1; i <= 10; i++) {
try{
Thread.sleep(1000);
} catch(InterruptedException e) {}
System.out.println(i);
if(i==5) autoSave = true;
}
System.out.println("프로그램을 종료합니다.");
} //main thread
public void run() {
while(true) { // 무한루프
try {
Thread.sleep(3 * 1000); // 3초마다
} catch(InterruptedException e) {}
// autoSave의 값이 true이면 autoSave()를 호출.
if(autoSave) autoSave();
}
} //daemon thread
public void autoSave() {
System.out.println("작업파일이 자동저장되었습니다.");
}
}
출력값
1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
프로그램을 종료합니다.
스레드의 상태
| 상태 | 설명 |
| NEW | 스레드가 생성되고 아직 start()가 호출되지 않은 상태 |
| RUNNABLE | 실행 중 또는 실행 가능한 상태 |
| BLOCKED | 동기화블럭에 의해서 일시정지된 상태(lock이 풀릴 때까지 기다리는 상태) |
| WAITING, TIMED_WAITING |
스레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable) 일시정지 상태. TIMED_WAITING은 일시정지시간이 지정된 경우를 의미 |
| TERMINATED | 스레드의 작업이 종료된 상태. |
스레드의 실행제어
- 스레드의 실행을 제어할 수 있는 메소드가 제공된다.
이 들을 활용해서 보다 효율적인 프로그램의 작성할 수 있다.
| 메서드 | 설명 |
| static void sleep(long millis) static void sleep(long millis, int nanos) (잠들기) |
지정된 시간(천분의 일초 단위)동안 쓰레드를 일시정지시킨다. 지정한 시간이 지나고 나면, 자동적으로 다시 실행대기 상태가 된다. |
| void join() void join(long millis) void join(long millis, int nanos) (기다리기) |
지정된 시간동안 쓰레드가 실행되도록 한다. 지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속한다. |
| void interrupt() (깨우기) |
sleep()이나 join()에 의해 일시정지상태인 쓰레드를 깨워서 실행대기 상태로 만든다. 해당 쓰레드에서 interruptedException이 발생함으로써 일시정지 상태를 벗어나게 된다. |
| void stop() | 쓰레드를 즉시 종료시킨다. |
| void suspend() (일시정지) | 쓰레드를 일시정지 시킨다. resume()을 호출하면 다시 실행대기 상태가 된다. |
| void resume() (재개) | suspend()에 의해 일시정지상태에 있는 쓰레드를 실행대기 상태로 만든다. |
| static void yield() (양보) | 실행 중에 자신에게 주어진 실행시간을 다른 쓰레드에게 양보하고 자신은 실행대기상태가 된다. |
'하.. > java' 카테고리의 다른 글
| ch13 스레드 실행 일시정지suspend() 재개 resume() 완전정지 stop() (0) | 2021.12.25 |
|---|---|
| ch13 스레드 실행제어 sleep() interrupt() (0) | 2021.12.25 |
| ch12 어노테이션 타입 정의하기 어노테이션의 요소 (0) | 2021.12.25 |
| ch12 메타 어노테이션 (0) | 2021.12.25 |
| ch12 표준 어노테이션 (0) | 2021.12.25 |