Java并发包里面提供了ThreadGroup类可以帮助我们有效地管理线程组。让我们来看一个生动的例子. Java线程组可以有线程对象或者子线程组组成。也就是说ThreadGroup可以是产生线程树。
让我们看一个简单的例子,这个例子模仿一个搜索任务,将启动10个线程遍历获取指定目录下面的excel文件列表,一旦有一个线程完成遍历,将中断其余的9个任务。
- import java.io.File;
- import java.util.concurrent.TimeUnit;
- public class SearchTask implements Runnable {
- private String rootDir;
- private SearchResult result;
- public SearchTask(String rootDir, SearchResult result) {
- super();
- this.rootDir = rootDir;
- this.result = result;
- }
- public String getRootDir() {
- return rootDir;
- }
- public void setRootDir(String rootDir) {
- this.rootDir = rootDir;
- }
- public SearchResult getResult() {
- return result;
- }
- public void setResult(SearchResult result) {
- this.result = result;
- }
- @Override
- public void run() {
- String name = Thread.currentThread().getName();
- System.out.printf("Thread %s: Start\n",name);
- try{
- doSearch(new File(this.rootDir));
- result.setTaskName(name);
- }catch(InterruptedException e){
- System.out.printf("Thread %s: Interrupted\n",name);
- return;
- }
- System.out.printf("Thread %s: End\n",name);
- }
- private void doSearch(File root) throws InterruptedException{
- if(root != null && root.isDirectory()){
- TimeUnit.SECONDS.sleep(1);
- File[] files = root.listFiles();
- if( files != null ){
- for(File file : files){
- if(file.isFile() && file.getName().endsWith(".xls")){
- result.getFiles().add(file.getAbsolutePath());
- result.increaseCount();
- }else if(file.isDirectory()){
- doSearch(file);
- }
- }
- }
- }
- }
- }
- package com.concurrent.exercise.threadgroup;
- import java.util.ArrayList;
- import java.util.List;
- public class SearchResult {
- private int count = 0;
- private String taskName;
- private List<String> files = new ArrayList<String>();
- public String getTaskName() {
- return taskName;
- }
- public void setTaskName(String taskName) {
- this.taskName = taskName;
- }
- public void setCount(int count) {
- this.count = count;
- }
- public void setFiles(List<String> files) {
- this.files = files;
- }
- public int getCount() {
- return count;
- }
- public void increaseCount() {
- count++;
- }
- public List<String> getFiles(){
- return files;
- }
- }
- import java.util.concurrent.TimeUnit;
- public class TestThreadGroup {
- public static void main(String[] args){
- String searchDir = "D:\\";
- ThreadGroup threadGroup = new ThreadGroup("Searcher");
- for(int i = 0; i < 3; i++){
- SearchTask task = new SearchTask(searchDir,new SearchResult());
- Thread thread = new Thread(threadGroup, task);
- thread.start();
- try{
- TimeUnit.SECONDS.sleep(2);
- }catch(InterruptedException e) {
- e.printStackTrace();
- }
- }
- waitFinish(threadGroup);
- threadGroup.interrupt();
- }
- private static void waitFinish(ThreadGroup threadGroup) {
- while (threadGroup.activeCount() > 2) {
- try {
- list(threadGroup);
- TimeUnit.SECONDS.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- private static void list(ThreadGroup threadGroup) {
- assert(threadGroup != null);
- threadGroup.list();
- }
- }
在启动三个线程后,进入waitFinish方法,当其中一个线程结束后,waitFinish立即对出并调用ThreadGroup终止剩下的线程。
由于ThreadGroup存储了线程和子线程组对象,可以使用ThreadGroup对一组线程执行统一的操作,比如interrupt.
可以参考Java API Doc知道更多关于ThreadGroup的方法。
相关推荐
微观经济学讲义-第13章博弈论
管理经济学讲义-之博弈论篇.ppt
博弈论与信息经济学讲义-.ppt
博弈论,又称游戏理论,是研究决策者在有冲突或合作情况下的决策行为的一种数学理论。这门学科广泛应用于经济学、政治学、社会学、心理学等多个领域,它通过数学模型来分析并预测个体间的策略互动结果。耶鲁大学的...
本项目聚焦于“五子棋”的Java实现,通过博弈算法来实现智能对战功能。下面将详细介绍五子棋的基本规则、Java编程语言在游戏开发中的应用以及博弈算法的相关知识。 五子棋是一种双人对弈的策略型棋类游戏,双方轮流...
复旦大学本科讲义-微观经济学讲义第13章 博弈论与竞争策略.pptx
### 博弈论专题知识点详解 #### 一、博弈论概览 博弈论,又称对策论,是现代数学的一个重要分支,主要研究在各种策略情况下,参与者如何做出决策以达到自身利益最大化。这一理论不仅在数学领域有广泛的应用,同时...
五子棋游戏想必大家都非常熟悉,游戏规则十分简单。...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
《伟大的博弈---华尔街金融帝国的崛起》.pdf
跨境电商贸易便利化监管的演化博弈分析--以前景理论为研究进路.pdf
七所大学的博弈论讲义,包括哈佛大学.卡内基梅隆大学.芝加哥大学.加利福尼亚大学(圣. 迭戈校区).加利福尼亚
人机博弈。PDF中文版。。。。。。。。。。。。。。。。。。。。。。。。。
哈佛大学的博弈论讲义是这个领域的权威资料之一,深受学者和学生们的喜爱。本讲义深入浅出地介绍了博弈论的基本概念、理论与应用,帮助读者理解在竞争与合作中的决策制定。 首先,我们要理解博弈论的核心概念——...
多站融合论文仿真-遗传算法-主从博弈_MasterSlaveGame-GA-SmartGrid
《用脑拿订单:销售中的全脑博弈》--大客户销售.pptx
《用脑拿订单:销售中的全脑博弈》--大客户销售.ppt
经济博弈论基础-第五章、动态贝叶斯博弈 经济博弈论基础是研究经济领域中博弈现象的理论基础,它的研究对象是经济主体之间的博弈行为。经济博弈论基础的研究内容包括策略型博弈、扩展型博弈、贝叶斯博弈等几个方面...
利率债中期投资策略:一致预期下的博弈-0709-民生证券-55页.pdf