데몬 스레드 (Deamon Thread)
주 스레드가 작업에 보조적인 역할을 수행하는 스레드(종속적 스레드)
주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료됨
스레드 그룹 생성
부모 그룹 지정하지 않으면 현재 스레드 속한 그룹의 하위 그룹으로 생성
interrupt() 모든 스레드 중지시키는 기능
데몬스레드 예제
package kr.co.kihd.daemon;
public class AutoSaveThread extends Thread{
public void save() {
System.out.println("작업 내용을 저장함.");
}
@Override
public void run() {
//1초 단위로 save()메서드 호출
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.save();
}
}
}
package kr.co.kihd.daemon;
import kr.co.kihd.threadgroup.AutoSaveThread;
public class DaemonTest {
public static void main(String[] args) {
AutoSaveThread autoSaveThread = new AutoSaveThread();
//daemon설정 (필히, start() 호출전에 설정을 해야한다.)
autoSaveThread.setDaemon(true);
autoSaveThread.start();
/*
* 메인스레드가 5초동안 정지하면, daemon스레드인 autoSaveThread가
* 실행되고, 메인스레드가 종료되면 더 이상 autoSaveThread실행이
* 안된다는 것을 알수 있다(종속적 관계이기 때문)
*/
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("메인스레드 종료됨");
}
}
스레드그룹 예제
package kr.co.kihd.threadgroup;
public class AutoSaveThread extends Thread{
public void save() {
System.out.println("작업 내용을 저장함.");
}
@Override
public void run() {
//1초 단위로 save()메서드 호출
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.save();
}
}
}
package kr.co.kihd.threadgroup;
import java.util.Map;
import java.util.Set;
public class ThreadGruopTest {
// 데몬 스레드는 다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는
// 스레드입니다. 일반 스레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료됩니다.
public static void main(String[] args) {
AutoSaveThread autoSaveThread = new AutoSaveThread();
autoSaveThread.setName("AutoSaveThread");
autoSaveThread.setDaemon(true);
autoSaveThread.start();
//Map컬렉션은 <키, 값> 키로 값을 찾아오는 자료구조의 한형태,
//단 Map은 인터페이스이다.
Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
//Map의 키값만 Set컬렉션 형태로 가져온다. (Set은 인터페이스이며,)
//구슬주머니와 같은 형태의 자료구조이다.
Set<Thread> threads = map.keySet();
for(Thread thread : threads) {
System.out.println("스레드 이름 : " + thread.getName()
+ ( (thread.isDaemon() ? "(데몬스레드)" : "(주스레드)")) );
//스레드그룹 출력
System.out.println("\t 소속 그룹 : " + thread.getThreadGroup().getName());
System.out.println();
}
}
}
스레드 이름 : Common-Cleaner(데몬스레드)
소속 그룹 : InnocuousThreadGroup
스레드 이름 : Reference Handler(데몬스레드)
소속 그룹 : system
스레드 이름 : Finalizer(데몬스레드)
소속 그룹 : system
스레드 이름 : Signal Dispatcher(데몬스레드)
소속 그룹 : system
스레드 이름 : Attach Listener(데몬스레드)
소속 그룹 : system
스레드 이름 : AutoSaveThread(데몬스레드)
소속 그룹 : main
스레드 이름 : main(주스레드)
소속 그룹 : main
인터럽트 사용
package kr.co.kihd.threadgroup2;
//스레드 그룹이름 현재스레드 이름 출력하는 코드 끝나는 조건을 인터럽발생되면 브레이크
public class WorkThread extends Thread{
public WorkThread(ThreadGroup threadGroup, String threadname) {
super(threadGroup, threadname); //조상클래스의 매개변수가 있는 생성자를 호출
}
@Override
public void run() {
//현재 실행되고 있는 스레드 그룹을 얻음
ThreadGroup mainGruop = Thread.currentThread().getThreadGroup();
String str = mainGruop.getName();
System.out.println("스레드 그룹 이름 : " + str);
while(true) {
//스레드 너무 빨리실행되어 sleep() 추가
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(this.getName() + " 인터럽트 호출됨!");
break;
}
}
System.out.println(this.getName() + "종료됨");
}
}
package kr.co.kihd.threadgroup2;
public class ThreadGroupTest {
public static void main(String[] args) {
//현재 실행되고 있는 스레드 그룹 얻어옴
ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
String threadGroup = mainGroup.getName();
System.out.println(threadGroup);
//myGroup은 main그룹의 하위 그룹으로 만들어짐
ThreadGroup myGroup = new ThreadGroup("myGroup");
WorkThread workThreadA = new WorkThread(myGroup, "workThreadA");
WorkThread workThreadB = new WorkThread(myGroup, "workThreadB");
workThreadA.start();
workThreadB.start();
System.out.println("[메인 스레드 그룹의 list()메서드 호출후 출력 내용]");
ThreadGroup mainGroup2 = Thread.currentThread().getThreadGroup();
mainGroup2.list();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
myGroup.interrupt();
}
}