当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

博弈Java讲义 - Java线程之ThreadGroup

发表于: 2014-11-27   作者:boyitech   来源:转载   浏览次数:
摘要: Java并发包里面提供了ThreadGroup类可以帮助我们有效地管理线程组。让我们来看一个生动的例子. Java线程组可以有线程对象或者子线程组组成。也就是说ThreadGroup可以是产生线程树。   让我们看一个简单的例子,这个例子模仿一个搜索任务,将启动10个线程遍历获取指定目录下面的excel文件列表,一旦有一个线程完成遍历,将中断其余的9个任务。 

Java并发包里面提供了ThreadGroup类可以帮助我们有效地管理线程组。让我们来看一个生动的例子. Java线程组可以有线程对象或者子线程组组成。也就是说ThreadGroup可以是产生线程树。 
  让我们看一个简单的例子,这个例子模仿一个搜索任务,将启动10个线程遍历获取指定目录下面的excel文件列表,一旦有一个线程完成遍历,将中断其余的9个任务。 


Java代码  
  1. import java.io.File;  
  2. import java.util.concurrent.TimeUnit;  
  3.   
  4. public class SearchTask implements Runnable {  
  5.   
  6.     private String rootDir;  
  7.     private SearchResult result;  
  8.   
  9.     public SearchTask(String rootDir, SearchResult result) {  
  10.         super();  
  11.         this.rootDir = rootDir;  
  12.         this.result = result;  
  13.     }  
  14.   
  15.     public String getRootDir() {  
  16.         return rootDir;  
  17.     }  
  18.   
  19.     public void setRootDir(String rootDir) {  
  20.         this.rootDir = rootDir;  
  21.     }  
  22.       
  23.     public SearchResult getResult() {  
  24.         return result;  
  25.     }  
  26.       
  27.     public void setResult(SearchResult result) {  
  28.         this.result = result;  
  29.     }  
  30.   
  31.     @Override  
  32.     public void run() {  
  33.         String name = Thread.currentThread().getName();  
  34.         System.out.printf("Thread %s: Start\n",name);  
  35.         try{  
  36.             doSearch(new File(this.rootDir));  
  37.             result.setTaskName(name);  
  38.         }catch(InterruptedException e){  
  39.             System.out.printf("Thread %s: Interrupted\n",name);  
  40.             return;  
  41.         }  
  42.         System.out.printf("Thread %s: End\n",name);  
  43.     }  
  44.       
  45.     private void doSearch(File root) throws InterruptedException{     
  46.         if(root != null && root.isDirectory()){  
  47.             TimeUnit.SECONDS.sleep(1);  
  48.             File[] files = root.listFiles();  
  49.             if( files != null ){  
  50.                 for(File file : files){  
  51.                     if(file.isFile() && file.getName().endsWith(".xls")){  
  52.                         result.getFiles().add(file.getAbsolutePath());  
  53.                         result.increaseCount();  
  54.                     }else if(file.isDirectory()){  
  55.                         doSearch(file);  
  56.                     }  
  57.                 }  
  58.             }  
  59.         }  
  60.     }  
  61. }  
  62. package com.concurrent.exercise.threadgroup;  
  63.   
  64. import java.util.ArrayList;  
  65. import java.util.List;  
  66.   
  67. public class SearchResult {  
  68.       
  69.     private int count = 0;  
  70.     private String taskName;  
  71.     private List<String> files = new ArrayList<String>();  
  72.       
  73.     public String getTaskName() {  
  74.         return taskName;  
  75.     }  
  76.   
  77.     public void setTaskName(String taskName) {  
  78.         this.taskName = taskName;  
  79.     }  
  80.   
  81.     public void setCount(int count) {  
  82.         this.count = count;  
  83.     }  
  84.   
  85.     public void setFiles(List<String> files) {  
  86.         this.files = files;  
  87.     }  
  88.   
  89.     public int getCount() {  
  90.         return count;  
  91.     }  
  92.   
  93.     public void increaseCount() {  
  94.         count++;  
  95.     }  
  96.   
  97.     public List<String> getFiles(){  
  98.         return files;  
  99.     }  
  100.       
  101. }  
  102.   
  103. import java.util.concurrent.TimeUnit;  
  104.   
  105. public class TestThreadGroup {  
  106.   
  107.     public static void main(String[] args){  
  108.         String searchDir = "D:\\";  
  109.         ThreadGroup threadGroup = new ThreadGroup("Searcher");  
  110.         for(int i = 0; i < 3; i++){  
  111.             SearchTask task = new SearchTask(searchDir,new SearchResult());  
  112.             Thread thread = new Thread(threadGroup, task);  
  113.             thread.start();  
  114.             try{  
  115.                 TimeUnit.SECONDS.sleep(2);  
  116.             }catch(InterruptedException e) {  
  117.                 e.printStackTrace();  
  118.             }  
  119.         }  
  120.         waitFinish(threadGroup);  
  121.         threadGroup.interrupt();  
  122.     }  
  123.       
  124.     private static void waitFinish(ThreadGroup threadGroup) {  
  125.         while (threadGroup.activeCount() > 2) {  
  126.             try {  
  127.                 list(threadGroup);  
  128.                 TimeUnit.SECONDS.sleep(1);  
  129.             } catch (InterruptedException e) {  
  130.                 e.printStackTrace();  
  131.             }  
  132.         }  
  133.     }  
  134.   
  135.     private static void list(ThreadGroup threadGroup) {  
  136.         assert(threadGroup != null);  
  137.         threadGroup.list();  
  138.     }  
  139.       
  140. }  


  在启动三个线程后,进入waitFinish方法,当其中一个线程结束后,waitFinish立即对出并调用ThreadGroup终止剩下的线程。 
  由于ThreadGroup存储了线程和子线程组对象,可以使用ThreadGroup对一组线程执行统一的操作,比如interrupt. 
  可以参考Java API Doc知道更多关于ThreadGroup的方法。 

博弈Java讲义 - Java线程之ThreadGroup

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
自定义指令 本章我们将详细讲解如何用AngularJS实现自定义指令(directives)来扩充HTML. 指令的基本
本节我们将通过几个具体的例子来讲解Angular表单。 简单的表单 ngModel指令实现了双向的数据绑定,
动画 AngularJS 1.3版本为常用的指令(ngRepeat,ngSwitch,ngView...)提供了动画支持,另外还可以通
Bootstrap 本节我们将分析Angular应用初始化流程以及怎样手动启动Angular应用。 Angular<script&
什么是AngularJS ? AngularJS是一款非常优秀的前端MVVM(Model-View-ViewModel)框架,它强大的双向
Angular HTML编译器可以让开发者通过定制标签或者属性来拓展HTML语法。通过Angular HTML编译器,我
基本概念 在使用AngularJS之前,我们有必要梳理一下AngularJS核心概念及实现原理,以便于写出结构良
在AngularJS中数据绑定(Data-binding)意指模型和视图组件之间的数据自动同步。AngularJS应用是基于
在写Angular应用时,我们通常把与视图逻辑无关的公共代码片段写在service组件中,然后以依赖注入的
什么是作用域? Angular中作用域(scope)是模板以及工作的上下文环境,作用域中存放了应用模型和视图
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号