데몬쓰레드는 무엇일까?
- 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행.
- 일반 쓰레드가 모두 종료되면 자동적으로 종료된다.
- 가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다.
- 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.
무한루프를 해놓아도 일반 쓰레드가 종료되면 자동적으로 종료되기 때문에 상관 없음.
boolean isDaemon() - 쓰레드가 데몬 쓰레드인지 확인한다.
void setDaemon(boolean on) - 쓰레드를 데몬 쓰레드로 또는 사용자 쓰레드로 변경
매개변수 on을 true로 지정하면 데몬 쓰레드가 된다.
setDaemon(boolean on)은 반드시 start()를 호출하기 전에 실행되어야 한다.
그렇지 않으면 IllegalThreadStateException이 발생한다.
음.. 코드에 주석으로 설명을 대신합니다
package ThreadPt;
public class ThreadSave implements Runnable{
static boolean autosave = false; // 자동저장 false로 꺼놓음.
public static void main(String[] args) {
Thread t = new Thread(new ThreadSave());
t.setDaemon(true); // true를 하면 데몬쓰레드가 생성됨
t.start();
for(int i=0; i<10; i++) {
try {
Thread.sleep(1000); //지연시간 1초로 줍니다.
} catch (InterruptedException e) {}
System.out.println(i);
// i가 5가되면 true로 바뀝니다.
if(i==5) {autosave = true;}
}
System.out.println("프로그램 종료");
}
// Runnable인터페이스 사용하려면 run 메서드를 오버라이딩 해야합니다.
@Override
public void run() {
while(true) {
try {
Thread.sleep(3 * 1000); // 3초마다 3*1000이 가독성에 더 좋음.
} catch (InterruptedException e) {}
if(autosave) autosave();
}
}
public void autosave() {
/* 실제 저장 코드가 들어오면 됨 */
System.out.println("저장되었습니다.");
}
}
뭔가 while문이여서 계속 돌아갈거 같지만.. 일반 쓰레드가 없으면 자동 종료됩니다.
여기서 t.setDaemon(true); 이 부분을 주석 처리하면 ( ? )
데몬스레드는 종료되지 않습니다!!
쓰레드의 상태
쓰레드의 상태에는 총 5가지 상태가 있다.
NEW - > RUNNABLE -> BLOCKED -> WATING, TIMED_WAITING -> TERMINATED
차례차례 정리하자면,
쓰레드를 생성하면 (NEW) 상태이고
그 다음 start()메서드를 이용해서 RUNNABLE(줄서기) 단계에 들어갑니다.
자기 차례가 오면 실행됨.
stop()이라는 메서드를 사용하거나 작업이 마치면 Terminated 상태 소멸 상태로 변하게 됩니다.
suspend() = 일시정지
sleep() = 잠자기
wait() = 기다리기
join() = 다른 스레드 기달리기
I/O block = 입출력 대기
실행을 하는데 I/O BLOCK 때문에 걸리면 일시정지 (쉼터) 대기실에 가서 대기하고 있습니다. BLOCKED
'Java' 카테고리의 다른 글
Java : 쓰레드의 동기화 (synchronization) - 기초 (0) | 2021.08.11 |
---|---|
Java : 쓰레드 메서드 join(), yield() (0) | 2021.08.11 |
Java : 쓰레드 메서드 suspend(), resume() ,stop() (0) | 2021.08.10 |
Java : 쓰레드 메서드 sleep() , interrupt() (0) | 2021.08.10 |
Java : 쓰레드(Thread) 의 기초 - 정리 (0) | 2021.08.09 |