이번 포스트는 남궁 성님의 "Java의 정석"이란 책을 참고하여 작성하였습니다.
포스트 내용 중에 오류나 수정 사항이 있으면 댓글 남겨주시면 감사드리겠습니다.
오늘은 쓰레드에 관한 세 번째 포스트를 작성하려고 합니다.
지난 포스트는 아래 링크를 참고하시면 감사드리겠습니다.
https://eloquence-developers.tistory.com/9
https://eloquence-developers.tistory.com/10
1. 데몬 쓰레드란?
데몬 쓰레드란 어떠한 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 쓰레드입니다.
ㅂ데몬 쓰레드는 백그라운드에서 특별한 작업을 수행하는 데에 종종 쓰인다고 합니다.
데몬 쓰레드의 가장 큰 특징 중 하나는 일반 쓰레드가 종료된 이후에는 데몬 쓰레드 역시 자동으로 종료된다는 점인데요, 이 점은 아래에 예시 코드에서 보다 자세히 살펴보겠습니다.
2. 데몬 쓰레드 선언
데몬 쓰레드는 일반 쓰레드 선언과 똑같이 선언해주시면 됩니다.
다만 한 가지 다른 점은 데몬 쓰레드를 실행하기 전에 setDaemon(true)를 호출해주시면 됩니다.
아래는 데몬 쓰레드를 사용한 예시입니다.
package package1;
public class Main implements Runnable {
static boolean autoSave=false;
public static void main(String args[]) {
Thread thread=new Thread(new Main());
thread.setDaemon(true); // 이 스레드르르 데몬 스레드로 설정
thread.start();
for(int i=0;i<10;i++){
try {
Thread.sleep(1000);
}catch(InterruptedException e) {}
System.out.println(i);
if(i==5) autoSave=true;
}
System.out.println("프로그램을 종료합니다.");
}
// 1초마다 작업파일을 자동저장
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(autoSave) autoSave();
}
}
public void autoSave() {
System.out.println("자동저장되었습니다.");
}
}
위 코드는 프로그램 시작 후 5초일 때부터 1초에 한 번씩 자동저장을 하는 프로그램입니다.
보시면 thread.setDaemon(true) 문장을 이용해서 이 쓰레드를 데몬 쓰레드로 지정해주었습니다.
이 문장으로 인해 쓰레드가 데몬 쓰레드가 되고, Main 쓰레드가 종료되었을 때 데몬 쓰레드 역시 종료되는 것입니다.
위 코드를 실행했을 때 결과는 아래와 같습니다.
0
1
2
3
4
5
6
자동저장되었습니다.
자동저장되었습니다.
7
자동저장되었습니다.
8
자동저장되었습니다.
9
프로그램을 종료합니다.
만약 setDaemon(true) 문장이 없다면 결과는 어떻게 될까요?
궁금해서 제가 직접해봤는데요, "프로그램을 종료합니다"라는 문장이 뜨기 전까지는 똑같은 결과가 나오지만 그 이후에는 쓰레드가 종료되지 않아 10초가 지난 이후에도 자동저장이 계속 진행되는 것을 확인할 수 있었습니다.
따라서 데몬 쓰레드가 일반 쓰레드가 종료되면 따라서 종료된다는 점을 확인할 수 있었고, 이로 인해 보조적으로 백그라운드 작업을 수행할 수 있다는 점을 깨달았습니다.
'컴퓨터 언어 > JAVA' 카테고리의 다른 글
[JAVA] 스택(Stack) 클래스 (0) | 2020.07.29 |
---|---|
[JAVA] 정수형(int)을 문자열(String)로 변환, 문자열(String)을 정수형(int)로 변환 (0) | 2020.07.02 |
[JAVA] 쓰레드(Thread) (2) (0) | 2020.06.18 |
[JAVA] 쓰레드(Thread) (1) (0) | 2020.06.17 |
[JAVA] 애너테이션(Annotation) (0) | 2020.06.14 |