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 的使用场景以及用法的更多相关文章

  1. SharedPreferences 的另一种场景的用法

    SharedPreferences 的另一种场景的用法 昨天,下班在家想做什么来着,然后想用SharedPreferences存点数据,但是不知道咋地突然想到,SharedPreferences是应用 ...

  2. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  3. yii框架场景的用法

    1.在 model 里面定义一下场景 类名必须是 scenarios() public function scenarios() { return [ 'create' => ['title', ...

  4. ognl表达式应用场景和用法

    ognl表达式的用法和应用场景 1.配置文件 //书写方式是:'${@类全限定名@常量}' dic_city.type=${@com.imooc.constant.DictionaryConstant ...

  5. 第十五节:深入理解async和await的作用及各种适用场景和用法

    一. 同步VS异步 1.   同步 VS 异步 VS 多线程 同步方法:调用时需要等待返回结果,才可以继续往下执行业务 异步方法:调用时无须等待返回结果,可以继续往下执行业务 开启新线程:在主线程之外 ...

  6. 深入理解async和await的作用及各种适用场景和用法

    https://www.cnblogs.com/yaopengfei/archive/2018/07/02/9249390.html https://www.cnblogs.com/xianyudot ...

  7. RunLoop 总结:RunLoop的应用场景(一)

    参考资料 好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看.我们在不同的阶段来相同的文章或资料或书籍都能有不同的收获,那它就是好文章,好书籍,好资料.关于iOS 中的RunLoop资料非 ...

  8. 深入分析@Transactional的用法

    关键词:事务, 编程式事务,声明式事务.spring 事务管理.AOP事务增强.@Transactional 在分析深入分析@Transactional的使用之前,我们先回顾一下事务的一些基本内容. ...

  9. python+selenium自动化软件测试(第4章):场景判断与封装

    4.1 显示等待WebDriverWait 前言:在脚本中加入太多的sleep后会影响脚本的执行速度,虽然implicitly_wait()这种隐式等待在一定程度上节省了很多时间.但是一旦页面上某些j ...

随机推荐

  1. labelme2COCO

    # -*- coding:utf-8 -*-# !/usr/bin/env python import argparseimport jsonimport matplotlib.pyplot as p ...

  2. [Jenkins] 执行SoapUI的task,设置邮件内容为HTML+CSS

    设置邮件内容:Default Content <span style="font-family:verdana;font-size:16px;color:black;font-weig ...

  3. ASP.NET MVC 跨controller函数调用

    var controller = DependencyResolver.Current.GetService<ControllerClassName>(); controller.User ...

  4. libevent学习

    libevent是一个开源的事件控制机制,如果不想陷入多进程或多线程的困扰,那么libevent将是很合适的工具. libevent提供了很多的API来管理和控制事件,可用于设计读.写.信号.定时等各 ...

  5. 前端福利之表单input按钮在各浏览器之间的兼容性(转)

    从网上看了这篇关于表单input按钮的浏览器兼容性问题,总结的还不错,所以copy下来学习下. input按钮在各个浏览器之间的兼容性问题,看下边这段代码: input.item { backgrou ...

  6. Linux中找不到service命令

    解决方法: 1.su -l root su root:的话只是将当前身份转为root,用户shell并没有改变.所以有些系统命令不能使用.  su -或者su -l或者su -l root,可以完全的 ...

  7. 解剖JavaScript中的null和undefined【转】

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位 ...

  8. VC中_T()的作用

    Windows使用两种字符集ANSI和UNICODE, 前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况. 而后者是双字节方式,方便处理双字节字符. W ...

  9. linux 进阶2--C++读取lua文件中的变量、一维表、二维表

    lua 语言非常灵活,一般把lua 作为脚本文件,会用C++与之进行交互.最重要的是C++代码能读取到脚本中的变量.一维表.二维表. 这样有些参数就可以在lua文件进行更改,而不用重新更改C++代码. ...

  10. python变量和简单的数据类型

    1.运行hello_world.py时发生的情况 运行hello_world.py时,Python都做了些什么呢?实际上,即便是运行简单的程序,Python所做的工作也相当多: #!/usr/bin/ ...