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里,流是一个很重要的 ...
随机推荐
- Android中Activity的四种启动方式
谈到Activity的启动方式必须要说的是数据结构中的栈.栈是一种只能从一端进入存储数据的线性表,它以先进后出的原则存储数据,先进入的数据压入栈底,后进入的数据在栈顶.需要读取数据的时候就需要从顶部开 ...
- 快速上手Runtime(二)之给分类添加属性
我们都知道,分类是不能直接添加属性的,那么我们有时候又需要实现这个功能,那么我们应该怎么办才能为分类添加上属性呢. Runtime给分类添加属性原理 给一个类声明属性,其实本质就是给这个类添加关联,并 ...
- SpringData JPA整理
一 首先熟悉几种jpa中的接口Repository,CrudRepository,PagingAndSortingRepository,JpaRepository,JpaSpecificationEx ...
- git使用报错: fatal: Couldn't find remote ref master的解决方法
fatal: Couldn't find remote ref master 翻译过来就是:致命的:无法找到远程参考主,也就是报错的意思.错误的提示内容意思是找不到需要连接的对象. 解决方法有以下几种 ...
- Windows ---- mysql 5.7 配置安装
去官网下载mysql 下载地址 https://dev.mysql.com/downloads/mysql/ 根据自己操作系统位数选择相对应的版本 点击Download下载 下载下来后是一 ...
- [SoapUI] 通过Groovy写文本文件
如果文件已经存在,先删除,然后向文件中追加失败信息 if(maxRecordFail>0){ def testResultFile = new File(projectDir+"\\T ...
- Sql的行列转换
创建表scores 一.传统的行列转换 纵表转横表 我们要转成的横表是这样子的: pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用.主要用于行和列的转 ...
- js教程系列32 :javascript-DOM节点操作
1 DOM节点操作 1.1 创建节点 createElement() var createDiv = document.createElement("div"); 1.2 插入子节 ...
- 创建Jutil (单元测试)
如何创建JUtil 这里拿Dynamic项目来演示,首先创建一个Dynamic项目,起名,点next, 继续点next, 将web.xml文件勾选,finish, 接下来在Java Resources ...
- mybatis所需pom文件内容以及配置文件
官方网站http://www.mybatis.org/mybatis-3/zh/index.htmlpom文件<?xml version="1.0" encoding=&qu ...