2,ThreadGroup 概念以及用法
当一个任务需要多个子线程去处理业务,这时候不希望这些子线程杂乱无章, 就需要把这些线程统一管理起来,这时候线程组就产生了。
ThreadGroup 常用方法讲解
activeCount()返回此线程组中活动线程的估计数。activeGroupCount()返回此线程组中活动线程组的估计数。enumerate(Thread[] list)把此线程组及其子组中的所有活动线程复制到指定数组中。enumerate(Thread[] list, boolean recurse)把此线程组中的所有活动线程复制到指定数组中。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 概念以及用法的更多相关文章
- (转载)OC学习篇之---协议的概念和用法
在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Jav ...
- OC中协议的概念以及用法
OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习 ...
- scrapy之基础概念与用法
scrapy之基础概念与用法 框架 所谓的框架就是一个项目的半成品.也可以说成是一个已经被集成了各种功能(高性能异步下载.队列.分布式.解析.持久化等)的具有很强通用性的项目模板. 安装 Linux: ...
- Android中Cursor类的概念和用法[转]
首页 > 程序开发 > 移动开发 > Android > 正文 Android中Cursor类的概念和用法 2011-09-07 0个评论 收藏 ...
- Python yield 的基本概念和用法
之前解析MQTT协议时,需要做一个等分字节流的操作,其中用到了yield关键字,如下: def get_var_length(hstring): m = 1 v = 0 for element in ...
- (4.5)DBCC的概念与用法(DBCC TRACEON、DBCC IND、DBCC PAGE)
转自:http://www.cnblogs.com/huangxincheng/p/4249248.html DBCC的概念与用法 一:DBCC 1:什么是DBCC 我不是教学老师,我也说不到没有任何 ...
- OC学习篇之---协议的概念和用法
这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字 ...
- JAVA中数组的基本概念与用法
JAVA中数组的基本概念与用法 1. 数组的定义与特点 数组的一种引用数据类型 数组中可以同时存放多个数据,但是数据的类型必须统一 数组的长度在开始时就需要确定,在程序运行期间是不可改变的 虽然可以使 ...
- 了解PHP中Stream(流)的概念与用法(转)
Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数.Stream可以翻译为“流”,在Java里,流是一个很重要的 ...
随机推荐
- C# ValueTypes
[C# ValueTypes] 1.哪些类型是ValueType? The value types consist of two main categories: Structs Enumeratio ...
- 用java实现一个简易编译器
- UGUI防止穿透和判断点击的是否是UI
用UGUI做的UI,比如按钮,点击一下,后面的3D物体也会接收到点击事件! 1.UGUI自带的防穿透代码: if (EventSystem.current.IsPointerOverGameObjec ...
- python解析pcap文件中的http数据包
使用scapy.scapy_http就可以方便的对pcap包中的http数据包进行解析 scapy_http可以在https://github.com/invernizzi/scapy-http下载, ...
- 对称二叉树 · symmetric binary tree
[抄题]: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). ...
- 解决VS2013中的控制台一闪而过的问题
修改项目配置,右键点击项目,在右键菜单中选择属性,然后在弹出的对话框左侧列表中中选择 “配置属性”-->“链接器”-->“系统”,然后在右侧的列表中, 在第一项”子系统“的值中选择”控制台 ...
- dpdk中log的使用方法
1 log简介 dpdk中通过log系统记录相关的日志信息,每一条日志除日志内容外,还有两个附加信息,log级别和log类型.开发人员可根据级别和类型对日志信息进行过滤,只记录必要的日志.1.1 ...
- 洛谷 P3092 [USACO13NOV]没有找零No Change
题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...
- tp5 sql 大于小于
1.大于 $rwhere['ctime'] = array('egt',10000); 2.小于 $rwhere[);
- EXCEL 导入 R 的几种方法 R—readr和readxl包
导入Excel数据至R语言的几种方法 如有如下Excel数据源,如何将数据导入R语言呢?今天主要来介绍几种常见的方法: 一.使用剪贴板,然后使用read.table函数: 首先选择Excel中的数据源 ...