当一个任务需要多个子线程去处理业务,这时候不希望这些子线程杂乱无章, 就需要把这些线程统一管理起来,这时候线程组就产生了。

ThreadGroup  常用方法讲解

  1. activeCount()   返回此线程组中活动线程的估计数。
  2. activeGroupCount() 返回此线程组中活动线程组的估计数。
  3. enumerate(Thread[] list)   把此线程组及其子组中的所有活动线程复制到指定数组中。
  4. enumerate(Thread[] list, boolean recurse)  把此线程组中的所有活动线程复制到指定数组中。
  5. interrupt() 中断此线程组中的所有线程。
 package com.zyguo.thread;

 public class SleepRunnable implements Runnable{
private int sleepTime;
public SleepRunnable( int sleepTime ){
this.sleepTime = sleepTime;
}
@Override
public void run() {
try {
System.out.println( Thread.currentThread() + " begin sleep " + this.sleepTime );
Thread.sleep( sleepTime );
System.out.println( Thread.currentThread() + " end sleep " + this.sleepTime );
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
 package com.zyguo.thread;

 import java.util.ArrayList;

 public class ThreadGroupMain {
public static void main(String[] args) {
int threadNum = ;
final ThreadGroup tgroup = new ThreadGroup("test-threadgroup");
ArrayList<Thread> tList = new ArrayList<>();
//定义10个线程
for( int i = ; i < threadNum; i++ ){
Thread t = new Thread( tgroup, new SleepRunnable( + i*) ,"test-thread-" + i);
tList.add( t );
} System.out.println("before start, activeCount=" + tgroup.activeCount() ); //检验 enumerate 方法
Thread[] threads = new Thread[threadNum];
//获取所有的子线程
int num = tgroup.enumerate( threads );
System.out.println( "befor start thread, enumerate num=" + num );
for (Thread thread : tList) {
thread.start();
System.out.println("start thread = " + thread );
}
num = tgroup.enumerate( threads );
System.out.println( "all thread start, enumerate num=" + num ); //监控线程的活动的子线程数
Thread t = new Thread( new Runnable() {
@Override
public void run() {
int activeCount = tgroup.activeCount();
while ( activeCount > ) {
System.out.println("activeCount=" + activeCount );
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
activeCount = tgroup.activeCount();
}
System.out.println("all thread is stop, activeCount=" + activeCount );
}
}); t.start(); }
}

结果如下

before start, activeCount=
befor start thread, enumerate num=
start thread = Thread[test-thread-,,test-threadgroup]
Thread[test-thread-,,test-threadgroup] begin sleep
Thread[test-thread-,,test-threadgroup] begin sleep
start thread = Thread[test-thread-,,test-threadgroup]
start thread = Thread[test-thread-,,test-threadgroup]
start thread = Thread[test-thread-,,test-threadgroup]
Thread[test-thread-,,test-threadgroup] begin sleep
Thread[test-thread-,,test-threadgroup] begin sleep
start thread = Thread[test-thread-,,test-threadgroup]
Thread[test-thread-,,test-threadgroup] begin sleep
start thread = Thread[test-thread-,,test-threadgroup]
Thread[test-thread-,,test-threadgroup] begin sleep
start thread = Thread[test-thread-,,test-threadgroup]
Thread[test-thread-,,test-threadgroup] begin sleep
start thread = Thread[test-thread-,,test-threadgroup]
Thread[test-thread-,,test-threadgroup] begin sleep
start thread = Thread[test-thread-,,test-threadgroup]
Thread[test-thread-,,test-threadgroup] begin sleep
start thread = Thread[test-thread-,,test-threadgroup]
Thread[test-thread-,,test-threadgroup] begin sleep
all thread start, enumerate num=
activeCount=
activeCount=
activeCount=
activeCount=
activeCount=
Thread[test-thread-,,test-threadgroup] end sleep
activeCount=
Thread[test-thread-,,test-threadgroup] end sleep
activeCount=
Thread[test-thread-,,test-threadgroup] end sleep
activeCount=
Thread[test-thread-,,test-threadgroup] end sleep
activeCount=
Thread[test-thread-,,test-threadgroup] end sleep
activeCount=
Thread[test-thread-,,test-threadgroup] end sleep
activeCount=
Thread[test-thread-,,test-threadgroup] end sleep
activeCount=
Thread[test-thread-,,test-threadgroup] end sleep
activeCount=
Thread[test-thread-,,test-threadgroup] end sleep
activeCount=
Thread[test-thread-,,test-threadgroup] end sleep
all thread is stop, activeCount=

附上 ThreadGroup 所有的api

方法摘要
 int activeCount() 
          返回此线程组中活动线程的估计数。
 int activeGroupCount() 
          返回此线程组中活动线程组的估计数。
 boolean allowThreadSuspension(boolean b) 
          已过时。 此调用的定义取决于 suspend(),它被废弃了。更进一步地说,此调用的行为从不被指定。
 void checkAccess() 
          确定当前运行的线程是否有权修改此线程组。
 void destroy() 
          销毁此线程组及其所有子组。
 int enumerate(Thread[] list) 
          把此线程组及其子组中的所有活动线程复制到指定数组中。
 int enumerate(Thread[] list, boolean recurse) 
          把此线程组中的所有活动线程复制到指定数组中。
 int enumerate(ThreadGroup[] list) 
          把对此线程组中的所有活动子组的引用复制到指定数组中。
 int enumerate(ThreadGroup[] list, boolean recurse) 
          把对此线程组中的所有活动子组的引用复制到指定数组中。
 int getMaxPriority() 
          返回此线程组的最高优先级。
 String getName() 
          返回此线程组的名称。
 ThreadGroup getParent() 
          返回此线程组的父线程组。
 void interrupt() 
          中断此线程组中的所有线程。
 boolean isDaemon() 
          测试此线程组是否为一个后台程序线程组。
 boolean isDestroyed() 
          测试此线程组是否已经被销毁。
 void list() 
          将有关此线程组的信息打印到标准输出。
 boolean parentOf(ThreadGroup g) 
          测试此线程组是否为线程组参数或其祖先线程组之一。
 void resume() 
          已过时。 此方法只用于联合 Thread.suspend 和 ThreadGroup.suspend 时,因为它们所固有的容易导致死锁的特性,所以两者都已废弃。有关详细信息,请参阅 Thread.suspend()。
 void setDaemon(boolean daemon) 
          更改此线程组的后台程序状态。
 void setMaxPriority(int pri) 
          设置线程组的最高优先级。
 void stop() 
          已过时。 此方法具有固有的不安全性。有关详细信息,请参阅 Thread.stop()。
 void suspend() 
          已过时。 此方法容易导致死锁。有关详细信息,请参阅 Thread.suspend()。
 String toString() 
          返回此线程组的字符串表示形式。
 void uncaughtException(Thread t, Throwable e) 
          当此线程组中的线程因为一个未捕获的异常而停止,并且线程没有安装特定 Thread.UncaughtExceptionHandler 时,由 Java Virtual Machine 调用此方法。

2,ThreadGroup 概念以及用法的更多相关文章

  1. (转载)OC学习篇之---协议的概念和用法

    在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Jav ...

  2. OC中协议的概念以及用法

    OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习 ...

  3. scrapy之基础概念与用法

    scrapy之基础概念与用法 框架 所谓的框架就是一个项目的半成品.也可以说成是一个已经被集成了各种功能(高性能异步下载.队列.分布式.解析.持久化等)的具有很强通用性的项目模板. 安装 Linux: ...

  4. Android中Cursor类的概念和用法[转]

    首页 > 程序开发 > 移动开发 > Android > 正文   Android中Cursor类的概念和用法 2011-09-07      0个评论       收藏    ...

  5. Python yield 的基本概念和用法

    之前解析MQTT协议时,需要做一个等分字节流的操作,其中用到了yield关键字,如下: def get_var_length(hstring): m = 1 v = 0 for element in ...

  6. (4.5)DBCC的概念与用法(DBCC TRACEON、DBCC IND、DBCC PAGE)

    转自:http://www.cnblogs.com/huangxincheng/p/4249248.html DBCC的概念与用法 一:DBCC 1:什么是DBCC 我不是教学老师,我也说不到没有任何 ...

  7. OC学习篇之---协议的概念和用法

    这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字 ...

  8. JAVA中数组的基本概念与用法

    JAVA中数组的基本概念与用法 1. 数组的定义与特点 数组的一种引用数据类型 数组中可以同时存放多个数据,但是数据的类型必须统一 数组的长度在开始时就需要确定,在程序运行期间是不可改变的 虽然可以使 ...

  9. 了解PHP中Stream(流)的概念与用法(转)

    Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数.Stream可以翻译为“流”,在Java里,流是一个很重要的 ...

随机推荐

  1. SpringBoot整合ActiveMQ快速入门

    Spring Boot 具有如下特性: 为基于 Spring 的开发提供更快的入门体验 开箱即用,没有代码生成,也无需 XML 配置.同时也可以修改默认值来满足特定的需求. 提供了一些大型项目中常见的 ...

  2. solr的客户端操作:使用solrj进行curd操作

    导入相关的jar包 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-s ...

  3. 将中国标准时间转成yyyy-MM-dd

    public static void main(String[] args) throws ParseException { String s = "Tue Jul 12 00:00:00 ...

  4. 依赖VUE组件通讯机制实现场景游戏切换

  5. 01 lucene基础 北风网项目培训 Lucene实践课程 Lucene概述

    lucene-core-2.4.1.jar是lucene开发的核心jar包,lucene-analyzers-2.4.1.jar也是必不可少的.lucene-highlighter-2.4.1.jar ...

  6. U3D OnDrawGizmos

    private void OnDrawGizmos() { Debug.Log("OnDrawGizmos"); Gizmos.DrawWireSphere(this.transf ...

  7. 嵌套列表的加权和 · Nested List Weight Sum

    [抄题]: Given a nested list of integers, return the sum of all integers in the list weighted by their ...

  8. Python tkinter 副窗体置顶和取消置顶

    root = Tk() #置顶root.wm_attributes('-topmost',1) #取消置顶 root.wm_attributes('-topmost',0)

  9. 批处理for命令详解(转)

    FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)FOR 参数 %%变量名 IN (相关文件或命令) DO ...

  10. code2800 送外卖

    首先,对图进行一次Floyd(g[][]是图) 1.dfs:(u是当前在的节点,d是已经走的路程) void dfs(int u,int d){ if(d>=ans)return; bool f ...