Java에서는 스레드를 크게 두 종류로 나눌 수 있습니다: 일반 스레드와 데몬 스레드. 이 두 스레드의 가장 큰 차이점은 메인 스레드가 종료되었을 때의 동작 방식입니다.
setDaemon(true)
메서드를 호출해 스레드를 데몬으로 설정할 수 있습니다. 이 예제에서는 자동 저장 기능을 데몬 스레드로, 주 작업을 일반 스레드로 구현했습니다. 데몬 스레드는 메인 스레드가 종료되면 함께 종료되지만, 일반 스레드는 프로그램이 작업을 완료할 때까지 실행됩니다.
// AutoSave.java (데몬 스레드 역할)
class AutoSave extends Thread {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000); // 1초마다 자동 저장
System.out.println("자동 저장 중...");
} catch (InterruptedException e) {
System.out.println("AutoSave interrupted");
break;
}
}
}
}
// MainTask.java (일반 스레드 역할)
class MainTask extends Thread {
@Override
public void run() {
for (int i = 1; i <= 5; i++) { // 주요 작업을 5번 반복
System.out.println("주 작업 실행 중: " + i);
try {
Thread.sleep(1500); // 1.5초 대기
} catch (InterruptedException e) {
System.out.println("MainTask interrupted");
}
}
System.out.println("주 작업 완료!");
}
}
// Main.java (메인 클래스)
public class Main {
public static void main(String[] args) {
AutoSave autoSave = new AutoSave();
autoSave.setDaemon(true); // AutoSave를 데몬 스레드로 설정
autoSave.start();
MainTask mainTask = new MainTask();
mainTask.start(); // MainTask는 일반 스레드로 실행
}
}
AutoSave (데몬 스레드):
AutoSave
클래스는 run()
메서드에서 1초마다 "자동 저장 중..." 메시지를 출력합니다.setDaemon(true)
를 통해 데몬 스레드로 설정되어, 메인 스레드가 종료되면 AutoSave
도 종료됩니다.MainTask (일반 스레드):
MainTask
클래스는 주 작업을 수행하며, 1.5초마다 "주 작업 실행 중" 메시지를 출력합니다.MainTask
는 끝까지 실행됩니다.Main 클래스:
main
메서드에서 autoSave
와 mainTask
스레드를 각각 실행합니다.프로그램 실행 시 다음과 같은 결과가 예상됩니다.
자동 저장 중...
주 작업 실행 중: 1
자동 저장 중...
주 작업 실행 중: 2
자동 저장 중...
자동 저장 중...
주 작업 실행 중: 3
자동 저장 중...
자동 저장 중...
주 작업 실행 중: 4
자동 저장 중...
자동 저장 중...
주 작업 실행 중: 5
주 작업 완료!
이제 주 작업이 완료되면 프로그램이 종료되며, autoSave
스레드도 자동으로 종료됩니다.
아래의 코드에서는 Gugudan
클래스와 GugudanMain
클래스를 통해 두 개의 스레드를 생성하고 실행합니다.
package com.thread;
public class Gugudan extends Thread {
private int dan;
public Gugudan(int dan) {
this.dan = dan;
}
@Override
public void run() {
System.out.println(this.getName() + " 시작");
for (int i = 1; i < 300; i++) {
System.out.printf("%s X %s = %s%n", dan, i, (dan * i));
}
System.out.println(this.getName() + " 끝");
}
}
package com.thread;
public class GugudanMain {
public static void main(String[] args) {
Gugudan gugudan1 = new Gugudan(3); // 3단 구구단 스레드
Gugudan gugudan2 = new Gugudan(6); // 6단 구구단 스레드
System.out.println("시작");
// 기본 우선순위 확인 후 우선순위 설정
System.out.println(gugudan1.getPriority()); // 출력: 5
System.out.println(gugudan2.getPriority()); // 출력: 5
gugudan1.setPriority(1); // gugudan1의 우선순위를 1로 설정 (낮음)
gugudan2.setPriority(9); // gugudan2의 우선순위를 9로 설정 (높음)
gugudan1.setName("3단"); // gugudan1의 이름 설정
gugudan2.setName("6단"); // gugudan2의 이름 설정
// 스레드 시작
gugudan1.start();
gugudan2.start();
System.out.println("끝");
}
}
코드 실행 순서:
gugudan1
과 gugudan2
두 스레드를 생성하고 각각 start()
메서드를 호출하여 실행을 시작합니다.gugudan1
과 gugudan2
는 각각 3단
과 6단
구구단을 출력하는 작업을 수행합니다.start()
메서드로 스레드를 실행하면서 메인 스레드는 System.out.println("끝")
을 출력하고 종료되지만, 일반 스레드로 생성된 gugudan1
과 gugudan2
가 작업을 완료할 때까지 프로그램은 종료되지 않습니다.데몬 스레드로 설정하려면:
gugudan1.setDaemon(true);
gugudan2.setDaemon(true);
위와 같이 설정하면 gugudan1
과 gugudan2
가 메인 스레드가 종료되면 자동으로 종료되는 데몬 스레드가 됩니다.
이 코드에서는 gugudan1
과 gugudan2
가 일반 스레드이기 때문에, 메인 스레드가 종료된 후에도 두 스레드의 작업이 모두 끝날 때까지 프로그램이 실행됩니다. 반면, 데몬 스레드로 설정된 경우 메인 스레드가 종료되면 두 스레드 역시 바로 종료됩니다.