3,ThreadGroup 的使用场景以及用法
1 一个大型任务,可分成多个独立的子线程并发进行,最后等待所有的子线程执行结束然后继续往下执行,
使用场景比如
要查找某个用户的最近三个月的通话记录,起 3 个子线程,分别查找最近三个月的记录,然后通过
int activeCount = tgroup.activeCount();
while ( activeCount > ) {
System.out.println("activeCount=" + activeCount );
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
activeCount = tgroup.activeCount();
}
阻塞住主线程,直到三个子线程全部执行结束,activeCount() == 0,继续玩下执行
2,一个大型任务,可分成多个独立的子线程并发进行,只要其中的某个子线程完成了任务条件,就算任务完成,则调用 threadGroup.interrupt() 方法 其他的子线程就可以停止了
使用场景如
用户表按用户ID分成了10个表,这时候想通过用户昵称找到这个用户,则这时候就可以使用threadGroup中的 interrupt 来实现了
package com.zyguo.thread;
public class SearchRunnable implements Runnable{
private int sleepTime;
public SearchRunnable( int sleepTime ){
this.sleepTime = sleepTime;
}
@Override
public void run() {
try {
System.out.println( Thread.currentThread() + " begin search " );
Thread.sleep( sleepTime );
System.out.println( Thread.currentThread() + " end search, 耗时 " + this.sleepTime );
} catch (InterruptedException e) {
System.out.println( Thread.currentThread() + " 被中断 " );
//e.printStackTrace();
}
}
}
package com.zyguo.thread;
import java.util.ArrayList;
public class ThreadGroup_interrupt {
public static void main(String[] args) {
int threadNum = ;
final ThreadGroup tgroup = new ThreadGroup("search-threadgroup");
ArrayList<Thread> tList = new ArrayList<>();
//定义10个线程
for( int i = ; i < threadNum; i++ ){
Thread t = new Thread( tgroup, new SearchRunnable( + i*) ,"search-thread-" + i);
tList.add( t );
t.start();
System.out.println("start thread = " + t );
}
//监控线程的活动的子线程数
Thread t = new Thread( new Runnable() {
@Override
public void run() {
int activeCount = tgroup.activeCount();
while ( activeCount > ) {
System.out.println("activeCount=" + activeCount );
if( activeCount < ){
System.out.println("找到了需要的文件,开始终止其他的子线程" );
tgroup.interrupt();
break;
}
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
activeCount = tgroup.activeCount();
}
}
});
t.start();
}
}
结果如下
start thread = Thread[search-thread-,,search-threadgroup]
Thread[search-thread-,,search-threadgroup] begin search
start thread = Thread[search-thread-,,search-threadgroup]
Thread[search-thread-,,search-threadgroup] begin search
start thread = Thread[search-thread-,,search-threadgroup]
Thread[search-thread-,,search-threadgroup] begin search
start thread = Thread[search-thread-,,search-threadgroup]
Thread[search-thread-,,search-threadgroup] begin search
start thread = Thread[search-thread-,,search-threadgroup]
Thread[search-thread-,,search-threadgroup] begin search
Thread[search-thread-,,search-threadgroup] begin search
start thread = Thread[search-thread-,,search-threadgroup]
start thread = Thread[search-thread-,,search-threadgroup]
Thread[search-thread-,,search-threadgroup] begin search
start thread = Thread[search-thread-,,search-threadgroup]
Thread[search-thread-,,search-threadgroup] begin search
start thread = Thread[search-thread-,,search-threadgroup]
Thread[search-thread-,,search-threadgroup] begin search
start thread = Thread[search-thread-,,search-threadgroup]
Thread[search-thread-,,search-threadgroup] begin search
activeCount=
activeCount=
activeCount=
activeCount=
activeCount=
Thread[search-thread-,,search-threadgroup] end search, 耗时
activeCount=
Thread[search-thread-,,search-threadgroup] end search, 耗时
activeCount=
Thread[search-thread-,,search-threadgroup] end search, 耗时
activeCount=
Thread[search-thread-,,search-threadgroup] end search, 耗时
activeCount=
Thread[search-thread-,,search-threadgroup] end search, 耗时
activeCount=
Thread[search-thread-,,search-threadgroup] end search, 耗时
activeCount=
找到了需要的文件,开始终止其他的子线程
Thread[search-thread-,,search-threadgroup] 被中断
Thread[search-thread-,,search-threadgroup] 被中断
Thread[search-thread-,,search-threadgroup] 被中断
Thread[search-thread-,,search-threadgroup] 被中断
3,ThreadGroup 的使用场景以及用法的更多相关文章
- SharedPreferences 的另一种场景的用法
SharedPreferences 的另一种场景的用法 昨天,下班在家想做什么来着,然后想用SharedPreferences存点数据,但是不知道咋地突然想到,SharedPreferences是应用 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- yii框架场景的用法
1.在 model 里面定义一下场景 类名必须是 scenarios() public function scenarios() { return [ 'create' => ['title', ...
- ognl表达式应用场景和用法
ognl表达式的用法和应用场景 1.配置文件 //书写方式是:'${@类全限定名@常量}' dic_city.type=${@com.imooc.constant.DictionaryConstant ...
- 第十五节:深入理解async和await的作用及各种适用场景和用法
一. 同步VS异步 1. 同步 VS 异步 VS 多线程 同步方法:调用时需要等待返回结果,才可以继续往下执行业务 异步方法:调用时无须等待返回结果,可以继续往下执行业务 开启新线程:在主线程之外 ...
- 深入理解async和await的作用及各种适用场景和用法
https://www.cnblogs.com/yaopengfei/archive/2018/07/02/9249390.html https://www.cnblogs.com/xianyudot ...
- RunLoop 总结:RunLoop的应用场景(一)
参考资料 好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看.我们在不同的阶段来相同的文章或资料或书籍都能有不同的收获,那它就是好文章,好书籍,好资料.关于iOS 中的RunLoop资料非 ...
- 深入分析@Transactional的用法
关键词:事务, 编程式事务,声明式事务.spring 事务管理.AOP事务增强.@Transactional 在分析深入分析@Transactional的使用之前,我们先回顾一下事务的一些基本内容. ...
- python+selenium自动化软件测试(第4章):场景判断与封装
4.1 显示等待WebDriverWait 前言:在脚本中加入太多的sleep后会影响脚本的执行速度,虽然implicitly_wait()这种隐式等待在一定程度上节省了很多时间.但是一旦页面上某些j ...
随机推荐
- centos7 安装VMware Tools 遇到的一系列问题的解决方案
先部署源:http://www.cnblogs.com/jiu0821/p/8074463.html VMware Tools安装方法参考:http://www.cnblogs.com/jiu0821 ...
- Hibernate多对多操作
---------------------siwuxie095 Hibernate 多对多操作 以用户和角色为例 (一)多对多映射配置 第一步:创建两个实体类,用户和角色 第二步:让两个实体类之间互相 ...
- Ubuntu设置屏幕分辨率
Ubuntu设置屏幕分辨率 原创 2016年10月14日 13:01:24 14900 在虚拟机装好Ubuntu,进入系统分辨率是800*600,打开显示界面设置下分辨率,设置完怎么也选不上应用,于是 ...
- avalonjs 笔记
1>复选卡框和单选框 复选卡框 监控已选框的数组,即通过属性监控来判断是否全选 <div ms-controller="test"> <ul> < ...
- Linux下查看Nginx的并发连接数和连接状态-乾颐堂
Linux下查看Nginx等的并发连接数和连接状态. 1.查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态: netstat -n | awk '/^tcp/ {++S[$N ...
- ES5、6、7浅析
ECMA Script 它是一种由ECMA组织(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范 而我们学的JavaScript是ECMA的实现, 但术语ECMAScript和JavaScript ...
- 白盒测试实践项目(day5)
在这几天的工作下,小组成员都基本完成了各自所负责的内容. 李建文同学完成提交了代码复审相关文档后,也经过小组的补充,彻底完成. 汪鸿同学使用FIndBugs工具完成了静态代码的测试,并且也完成了静态代 ...
- Spring框架总结(八)
二.Cglib代理名词理解: Cglib代理,也叫做子类代理.利用继承关系实现被代理类的功能扩展.缺点: (1)JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口. ...
- kcp源码走读
kcp协议与tcp协议类似,是一种ARQ协议.他的优点在于比tcp的延迟更小30%-40%,但相应的会牺牲一部分的带宽,大该比tcp多浪费10%~20%.tcp的设计目标是增大网络利用率,而kcp的设 ...
- [Erlang09]Erlang gen_server实现定时器(interval)的几种方法及各自的优缺点?
方法1: %%gen_server:部分call_back function. -define(TIME,1000). init([]) –> erlang:send_after(?TIME,s ...