https://youtu.be/W0v3Gwx92hc?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.
[데몬 쓰레드(demon thread)]
- 일반 쓰레드(non - daemon thread)의 작업을 돕는 보조적인 역할을 수행한다.
- 일반 쓰레드가 모두 종료되면 자동적으로 종료된다.
- 어떤 일을 할 때 데몬 쓰레드를 사용할까?
- 가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다.
- 무한 루프와 조건문을 이용해서 실행 후 대기하다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.
- 무한루프는 자동 종료가 되는 것이기 때문에 무한루프로 작성해도 괜찮다.
boolean isDaemon() //쓰레드가 데몬 쓰레드인지 확인한다. 데몬 쓰레드면 true 반환
void setDaemon(boolean on) //쓰레드를 데몬 쓰레드로 또는 사용자 쓰레드로 변경한다.
//매개변수 on을 true로 지정하면 데몬 쓰레드가 된다.
- setDaemon(boolean on)은 반드시 start() 호출 전에 실행되어야 한다. 그렇지 않으면 IllegalThreadStateException이 발생한다.
[실습]
package javajungsuk;
public class Java13_7 implements Runnable{
static boolean autoSave = false;
public static void main(String[] args) {
/*Runnable 인터페이스 구현으로 쓰레드를 사용하는데
* 이때 우리는 run()함수를 구현한 객체를 돌려주는 방식을 사용했다.
*/
Thread t = new Thread(new Java13_7()); //Thread(Runnable r)
t.setDaemon(true); // start()보다 먼저 사용!!! 이부분이 없으면 종료 X
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("프로그램을 종료합니다.");
}
public void run() {
while(true) {
try {
Thread.sleep(3*1000);//3초마
} catch (InterruptedException e) {}
if(autoSave) autoSave();
}
}
public void autoSave() {
System.out.println("작업 파일이 자동저장되었습니다.");
}
}
- 5초 이후부턴 autoSave 값이 true가 되고 자동 저장이 되는 것, 그리고 나선 3초마다 자동저장을 해준다.
- 무한루프여도 데몬 쓰레드로 만들어서 main(일반 쓰레드)가 종료되고 나면 데몬 쓰레드도 종료가 된다.
- setDaemon(true)
[출력 값]
1
2
3
4
5
작업 파일이 자동저장되었습니다.
6
7
8
작업 파일이 자동저장되었습니다.
9
10
프로그램을 종료합니다.
[쓰레드의 상태]
- RUNNABLE
- 실행 시작 했다고 바로 시작하는 것이 아니고 앞 뒤로 실행을 대기 줄서기를 해서 실행까지 기다렸다 실행되면 실행을 하다 끝나면 다시 첫 번째 줄로 돌아가서 줄을 서는 것이고 stop()을 하면 소멸을 한다.
- 일시정지 되는 상태로 쓰레드가 이동함. (WAITING, BLOCKED)
- suspend() - 일시정지
- sleep() - 잠자기
- wait() - 기다리는 것
- join() - 다른 쓰레드 기다리는 것
- I/O block - 입출력 대기
[쓰레드의 실행제어]
- 쓰레드의 실행을 제어할 수 있는 메서드가 제공된다.
'Java > 객체지향' 카테고리의 다른 글
[객체지향][쓰레드/thread] - suspend(), resume(), stop() (0) | 2022.03.02 |
---|---|
[객체지향][쓰레드/thread] - sleep(), interrupt() (0) | 2022.03.02 |
[객체지향][쓰레드/thread] - 쓰레드의 우선순위, 쓰레드 그룹 (0) | 2022.03.01 |
[객체지향][쓰레드/thread] - 싱글 쓰레드와 멀티 쓰레드, 쓰레드의 I/O 블락킹 (0) | 2022.02.28 |
[객체지향][쓰레드/thread] - 쓰레드구현과 실행 (0) | 2022.02.26 |