一、
public class Main { public static void main(String[] args) { System.out.println("main thread: " + Thread.currentThread().getName());// 主线程组名称,输出:main ThreadGroup tGroup = new ThreadGroup("hahaTGroupName"); System.out.println("custom thread: " + tGroup.getName());// 自定义线程组名称,输出:hahaTGroupName MyThread mThread = new MyThread(); // 创建5个线程,并将该线程放入自定义线程组 for (int i = 0; i < 5; i++) { Thread thread = new Thread(tGroup, mThread);// 这东东的构造方法超多 thread.start(); } System.out.println("嘻嘻"); // 求出tGroup所拥有的线程数 System.out.println("active count: " + tGroup.activeCount()); // 列出tGroup里面有什么线程 tGroup.list();// 卧槽,不用打印的,就这个方法,就打印出来了 } } class MyThread implements Runnable { @Override public void run() { try { System.out.println("thread name: " + Thread.currentThread().getName()); TimeUnit.SECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }
二、
/* * 批量终止线程组内的线程 */ public class Main2 extends Thread { public Main2(ThreadGroup tg, String name) { super(tg, name); } public void run() { System.out.println("ThreadName = " + Thread.currentThread().getName() + "准备开始死循环了"); while (!this.isInterrupted()) { System.out.println(Thread.currentThread().getName() + "死循环中"); } System.out.println("ThreadName = " + Thread.currentThread().getName() + "结束了"); } public static void main(String[] args) throws InterruptedException { ThreadGroup tg = new ThreadGroup("我的线程组"); Main2 mt = null; for (int i = 0; i < 3; i++) { mt = new Main2(tg, "线程" + i); mt.start(); } Thread.sleep(2000); tg.interrupt(); System.out.println("调用了interrupt()方法"); } }
三、
public class Main3 { public static void main(String[] args) { /* * 从结果看,实例化了一个group出来,没有指定线程组,那么自动归到当前线程所属的线程组中,也就是隐式地在一个线程组中添加了一个子线程组。 */ System.out.println("主线程名称:" + Thread.currentThread().getName()); System.out.println("主线程所属的线程组名称:" + Thread.currentThread().getThreadGroup().getName()); System.out.println("主线程所属的线程组里面有多少线程组:" + Thread.currentThread().getThreadGroup().activeGroupCount()); ThreadGroup group = new ThreadGroup("新的组"); System.out.println("主线程名称:" + Thread.currentThread().getName()); System.out.println("主线程所属的线程组名称:" + Thread.currentThread().getThreadGroup().getName()); System.out.println("主线程所属的线程组里面有多少线程组:" + Thread.currentThread().getThreadGroup().activeGroupCount()); ThreadGroup[] tg = new ThreadGroup[Thread.currentThread().getThreadGroup().activeGroupCount()]; Thread.currentThread().getThreadGroup().enumerate(tg); for (int i = 0; i < tg.length; i++) System.out.println("第一个线程组名称为:" + tg[i].getName()); /* * 1、根线程组就是系统线程组system * 2、抛空指针异常是因为系统线程组上已经没有线程组了,所以system的getParent()方法返回的是null,对null调用getName()方法自然是NullPointerException */ System.out.println(Thread.currentThread().getThreadGroup().getParent().getName()); System.out.println(Thread.currentThread().getThreadGroup().getParent().getParent().getName()); } }
END: