
public ThreadGroup(String name)public ThreadGroup(ThreadGroup parent,String name)
public class ThreadGroupCreator{public static void main(String[] args){//① 获取当前线程的 groupThreadGroup currentGroup = Thread.currentThread().getThreadGroup();//② 定义一个新的 groupThreadGroup group1 = new ThreadGroup("Group1");//③ 程序输出 trueSystem.out.println(group1.getParent() == currentGroup);//④ 定义 group2,指定 group1 为其父 groupThreadGroup group2 = new ThreadGroup(group1, "Group2");//⑤ 程序输出 trueSystem.out.println(group2.getParent() == group1);}}
public int enumerate(Thread[] list)public int enumerate(Thread[] list,boolean recurse)
private int enumerate(Thread list[], int n, boolean recurse) {int ngroupsSnapshot = 0;ThreadGroup[] groupsSnapshot = null;synchronized (this) {if (destroyed) {return 0;}int nt = nthreads;if (nt > list.length - n) {nt = list.length - n;}for (int i = 0; i < nt; i++) {if (threads[i].isAlive()) {list[n++] = threads[i];}}if (recurse) {ngroupsSnapshot = ngroups;if (groups != null) {groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot);} else {groupsSnapshot = null;}}}if (recurse) {for (int i = 0 ; i < ngroupsSnapshot ; i++) {n = groupsSnapshot[i].enumerate(list, n, true);}}return n;}
public class ThreadGroupEnumerateThreads{public static void main(String[] args)throws InterruptedException{//创建一个 ThreadGroupThreadGroup myGroup = new ThreadGroup("MyGroup");//创建线程传入 threadgroupThread thread = new Thread(myGroup, () ->{while (true){try{TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e){}}}, "MyThread");thread.start();TimeUnit.MILLISECONDS.sleep(2);ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();Thread[] list = new Thread[mainGroup.activeCount()];int recurseSize = mainGroup.enumerate(list);System.out.println(recurseSize);recurseSize = mainGroup.enumerate(list, false);System.out.println(recurseSize);}}
enumerate 方法获取的线程仅仅是个预估值,并不能百分之百地保证当前 group 的活跃线程,比如在调用复制之后,某个线程结束了生命周期或者新的线程加入了进来,都会导致数据的不准确。
enumerate 方法的返回值 int 相较 Thread[] 的长度更为真实,比如定义了数组长度的 Thread 数组,那么 enumerate 方法仅仅会将当前活跃的 thread 分别放进数组中,而返回值 int 则代表真实的数量,并非 Thread 数组的长度,可能是早期版本就有这个方法的缘故(JDK1.0),其实用 List(JDK1.1 版本才引入)会更好一些。
public int enumerate(ThreadGroup[] list)public int enumerate(ThreadGroup[] list,boolean recurse)
public class ThreadGroupEnumerateThreadGroups{public static void main(String[] args)throws InterruptedException{ThreadGroup myGroup1 = new ThreadGroup("MyGroup1");ThreadGroup myGroup2 = new ThreadGroup(myGroup1,"MyGroup2");TimeUnit.MILLISECONDS.sleep(2);ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();ThreadGroup[] list = new ThreadGroup[mainGroup.activeGroupCount()];int recurseSize = mainGroup.enumerate(list);System.out.println(recurseSize);recurseSize = mainGroup.enumerate(list, false);System.out.println(recurseSize);}}
文章转载自Alleria Windrunner,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




