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가 일반 스레드이기 때문에, 메인 스레드가 종료된 후에도 두 스레드의 작업이 모두 끝날 때까지 프로그램이 실행됩니다. 반면, 데몬 스레드로 설정된 경우 메인 스레드가 종료되면 두 스레드 역시 바로 종료됩니다.