public void run() { while(true) { try { Thread.sleap(3 * 1000); //3초마다 휴식(계속 실행할 수 없으니) } catch(InterruptedException e) {} //autoSave의 값이 true면 autoSave()를 호출한다. if(autoSave) { autoSave(); } } }
boolean isDaemon()
true
로 반환한다.void setDeamon(boolean on)
쓰레드를 데몬쓰레드 또는 일반쓰레드로 변경한다.
✨✨반드시 start()를 호출하기 전에 실행되어야 한다.
-> 그렇지 않으면 IllegalThreadStateException
발생
✨✨setDaemon(boolean)
---> start()
ex13_07
class Ex13_07 implements Runnable {
static boolean autoSave = false;
public static void main(String[] args) {
Thread t = new Thread(new Ex13_07()); //Thread(Runnable r)
t.setDaemon(true); //이 부분이 없으면 종료되지 않는다.
t.start();
for(int i=1; i<=20; i++) {
try {
Thread.sleep(1000); //1초 휴식
} catch (InterruptedException e) {}
//1초 지나면 아래 수행, 즉 1초마다 i 출력
System.out.println(i);
//5초 되면 autoSave=true로 돼 autoSave()바로 수행!
//***그 뒤로는 3초 마다 수행!!!
if(i==5) autoSave = true;
}
System.out.println("프로그램을 종료합니다.");
}
public void run() {
while(true) { //무한루프지만 일반쓰레드가 종료되면 데몬쓰레드는 자동종료이므로 괜찮음
try {
Thread.sleep(3 * 1000); //3초 휴식
} catch (InterruptedException e) {}
//3초 지나면 아래 수행
//autoSave의 값이 true면 autoSave()호출
if(autoSave) autoSave();
}
}
public void autoSave() {
System.out.println("작업파일이 자동저장되었습니다.");
}
}
1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
11
작업파일이 자동저장되었습니다.
12
13
14
작업파일이 자동저장되었습니다.
15
16
17
작업파일이 자동저장되었습니다.
18
19
20
프로그램을 종료합니다.
만약 데몬쓰레드로 하지 않는다면??
-> 무한루프로 계속 실행됨
t.setDaemon(true);
를 없애면 ..
1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
11
작업파일이 자동저장되었습니다.
12
13
14
작업파일이 자동저장되었습니다.
15
16
17
작업파일이 자동저장되었습니다.
18
19
20
프로그램을 종료합니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
...
쓰레드 생성 -> start()
로 쓰레드 호출 -> 쓰레드들 줄서기 -> 자기 차례가 되면 실행하고 끝나면 다시 줄서기 반복 -> 작업이 다 끝나거나 stop()
으로 인해 멈춰서 소멸
중간에 suspend()
, sleep()
, wait()
, join()
, I/O block
등으로 인해 일시정지된다.(쉼터, 대기실)
time-out
, resume()
, notify()
, interrupt()
등으로 인해 다시 줄서기
static sleep(long)
, static yield()
: 다른 쓰레드에게 적용될 수 없고, 쓰레드 자기 자신에게만 호출 가능