package me.test.jdk.java.lang; // Test ThreadGroup and UncaughtExceptionHandler public class ThreadGroupTest { @SuppressWarnings("deprecation") public static void main(String[] args) throws InterruptedException { final int loopCount = 3; boolean usingParentThreadGroup = args.length == 0 ? false : true; ThreadGroup tg = null; if (usingParentThreadGroup) { // will upper to "system" ThreadGroup and ended without any error // output. tg = new ThreadGroup("MyWorkerRegistry"); } else { tg = new ThreadGroup("MyWorkerRegistry") { @Override public void uncaughtException(Thread t, Throwable e) { System.err.println("ERROR : " + t.getName()); e.printStackTrace(System.err); } }; } Thread t0 = new Thread(tg, new Runnable() { public void run() { for (int i = 0; i < loopCount; i++) { Thread t = Thread.currentThread(); String threadName = t.getName(); System.out.println(threadName + " 000 "); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); break; } } } }, "worker-0"); t0.start(); Thread t1 = new Thread(tg, new Runnable() { public void run() { for (int i = 0; i < loopCount * 2; i++) { Thread t = Thread.currentThread(); String threadName = t.getName(); System.out.println(threadName + " 111 "); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); break; } } } }, "worker-1"); t1.start(); Thread t2 = new Thread(tg, new Runnable() { public void run() { while (true) { Thread t = Thread.currentThread(); String threadName = t.getName(); System.out.println(threadName + " 222 "); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); break; } catch (ThreadDeath e) { System.out.println("AAAAAAAAAAAAA"); throw e; } } } }, "worker-2"); t2.start(); tg.list(); Thread.sleep(1000); Thread.sleep(loopCount * 1000); tg.list(); Thread.sleep(loopCount * 1000); tg.list(); Thread.sleep(loopCount * 1000); Thread[] activeThreads = new Thread[tg.activeCount()]; tg.enumerate(activeThreads); for (Thread t : activeThreads) { System.out.println("Stopping " + t); t.stop(); } Thread.sleep(loopCount * 1000); tg.list(); } }