반응형
package runnable_jar;
public class PrintThread extends Thread {
@Override
public void run() {
while (true) {
}
}
}
package runnable_jar;
import java.util.Map;
import java.util.Set;
public class InterruptExample {
public static void main(String[] args) {
PrintThread printThread = new PrintThread();
printThread.setName("Print Thread");
printThread.setDaemon(true);
printThread.start();
Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
Set<Thread> threads = map.keySet();
for(Thread thread : threads) {
System.out.println("Name : " + thread.getName() + ((thread.isDaemon() ? " 데몬" : "주")));
System.out.println("\t" + "소속그룹 : " + thread.getThreadGroup().getName());
System.out.println();
}
}
/** 기본 스레드 그룹 **/
// system : JVM 운영에 필요한 스레드를 포함
// main : 메인 스레드를 포함 (Print Thread는 Main Thread의 데몬 스레드이기 때문에 main 소속)
// Name : Notification Thread 데몬
// 소속그룹 : system
//
// Name : main주
// 소속그룹 : main
//
// Name : Signal Dispatcher 데몬
// 소속그룹 : system
//
// Name : Common-Cleaner 데몬
// 소속그룹 : InnocuousThreadGroup
//
// Name : Finalizer 데몬
// 소속그룹 : system
//
// Name : Print Thread 데몬
// 소속그룹 : main
//
// Name : Reference Handler 데몬
// 소속그룹 : system
//
// Name : Attach Listener 데몬
// 소속그룹 : system
}
package runnable_jar;
public class PrintThread extends Thread {
// 스레드 그룹 정해주는 생성자
public PrintThread(ThreadGroup threadGroup, String threadName) {
super(threadGroup, threadName);
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(getName() + " interrupted");
break;
}
}
System.out.println(getName() + "종료됨");
}
}
package runnable_jar;
public class ThreadGroupExample {
public static void main(String[] args) {
ThreadGroup myGroup = new ThreadGroup("myGroup"); // main - myGroup (계층도)
PrintThread printThreadA = new PrintThread(myGroup, "printThreadA"); // main - myGroup - printThreadA
PrintThread printThreadB = new PrintThread(myGroup, "printThreadB"); // main - myGroup - printThreadB
printThreadA.start();
printThreadB.start();
System.out.println("[main 스레드 그룹 list() 메소드 출력 내용]");
ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
mainGroup.list();
System.out.println();
// [main 스레드 그룹 list() 메소드 출력 내용]
// java.lang.ThreadGroup[name=main,maxpri=10]
// Thread[main,5,main]
// java.lang.ThreadGroup[name=myGroup,maxpri=10]
// Thread[printThreadA,5,myGroup]
// Thread[printThreadB,5,myGroup]
myGroup.interrupt(); // 상위 스레드 그룹에서 interrupt 발생시 하위 스레드도 전부 interupt 발생
// printThreadA interrupted
// printThreadA종료됨
// printThreadB interrupted
// printThreadB종료됨
}
}
반응형
'[Java] > [Java]' 카테고리의 다른 글
[Java] 익명 클래스, 함수형 인터페이스, 람다식 [익명 객체] (0) | 2023.08.07 |
---|---|
[Java] 자바 멀티스레드 [Multi-Thread] 스레드풀 (Thread Pool) (0) | 2022.09.23 |
[Java] 자바 멀티스레드 [Multi-Thread] Runnable vs Thread (0) | 2022.09.22 |
[Java] 자바 Generic (제네릭) (0) | 2022.09.13 |
[Java] 자바 InputStream, OutputStrema, Writer, Reader (0) | 2022.09.12 |