1. 끝나지 않는 쓰레드
앞전에 쓰레드의 정의 및 사용법을 익히며 쓰레드의 기본개념에 대해 살펴 보았다.
다음의 쓰레드 클래스를 살펴보자.
public class EndlessThread extends Thread{
private String name;
EndlessThread(String name){
this.name=name;
}
@Override
public void run() {
while (true){
try {
System.out.println(name+" : "+System.currentTimeMillis());
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
public class RunEndlessThread {
public static void main(String[] args) {
EndlessThread et = new EndlessThread("Thread1");
et.start();
try {
Thread.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
이 쓰레드 클래스를 start() 하게 되면 무한루프를 돌며 시스템의 현재 시간을 출력할 것이다.
즉, main() 메소드가 수행이 종료되어도 main() 메소드 혹은 다른 메소드에서 시작한 쓰레드가 종료하지 않으면 해당 자바 프로세스는 끝나지 않는다.
하지만 데몬 프로세스는 예외이다. main() 메소드만 수정하여 변화를 찾아보자.
2. 데몬 쓰레드
public class EndlessThread extends Thread{
private String name;
EndlessThread(String name){
this.name=name;
}
@Override
public void run() {
while (true){
try {
System.out.println(name+" : "+System.currentTimeMillis());
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
public class RunEndlessThread {
public static void main(String[] args) {
EndlessThread et = new EndlessThread("Thread1");
et.setDaemon(true);
et.start();
try {
et.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
et.setDaemon(true) 한줄을 추가하였다. 이는 현재 쓰레드를 데몬 스레드로 활성화 시키는 코드이며 무한루프를 돌았던 이전과는 다르게 3번의 시간이 출력되고 종료되었다.
et.start() 로 쓰레드를 run하고 et.sleep(2000) 으로 2초의 대기시간을 부여하였다.
따라서 반복문을 시작하며 한번, 1초뒤 1번, 2초뒤 한번 시간을 출력하고 프로세스가 종료되는 것을 확인 할 수 있다.
즉, 데몬 쓰레드는 해당 쓰레드가 종료되지 않아도 다른 실행중인 일반 쓰레드가 없다면, 멈춰버린다.
'JAVA' 카테고리의 다른 글
컬렉션 프레임워크(Collection Framework) (3) - Map (0) | 2021.12.28 |
---|---|
컬렉션 프레임워크(Collection Framework) (2) - Set & Queue (0) | 2021.12.27 |
컬렉션 프레임워크(Collection Framework) (1) - 리스트(List) (0) | 2021.12.27 |
쓰레드(3) - Synchronized (1) | 2021.12.24 |
쓰레드(1) - 쓰레드의 사용법 및 정의 (0) | 2021.12.24 |
제네릭(Generic) 이란? (2) | 2021.12.21 |