线程管理(十)线程组
声明:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:方腾飞
线程组
Java并发 API里有个有趣的方法是把线程分组。这个方法允许我们按线程组作为一个单位来处理。例如,你有一些线程做着同样的任务,你想控制他们,无论多少线程还在运行,他们的状态会被一个call 中断。
Java 提供 ThreadGroup 类来组织线程。 ThreadGroup 对象可以由 Thread 对象组成和由另外的 ThreadGroup 对象组成,生成线程树结构。
在这个指南中, 我们将开发一个简单的例子来学习 ThreadGroup 对象。我们有 10 个随机时间休眠的线程 (例如,模拟搜索),然后当其中一个完成,就中断其余的。
准备
指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。
怎么做呢…
按照这些步骤来实现下面的例子::
首先,创建一个类名为 Result。它会保存最先结束的线程的名字。声明一个 private String 属性名为 name 并提供相应的读值和设置值的方法。 创建一个类名为 SearchTask a并一定实现 Runnable 接口。public class SearchTask implements Runnable {
声明一个Result类的 private 属性变量并实现和初始化这类属性的构造函数。private Result result; public SearchTask(Result result) { this.result=result; 4. 实现run()方法。 它会调用doTask() 方法和等待它结束或者接收一个 InterruptedException 异常。 这方法会写信息表明开始,结束,或者线程中断。
@Override
public void run() {
String name=Thread.currentThread().getName();
System.out.printf("Thread %s: Startn",name);
try {
doTask();
result.setName(name);
} catch (InterruptedException e) {
System.out.printf("Thread %s: Interruptedn",name);
return;
}
System.out.printf("Thread %s: Endn",name);
}
5. 实现 doTask() 方法。它会创建一个 Random 对象生一个随机数字并用这个数字调用 sleep() 方法 。
private void doTask() throws InterruptedException {
Random random=new Random((new Date()).getTime());
int value=(int)(random.nextDouble()*100);
System.out.printf("Thread %s: %dn",Thread.currentThread(). getName(),value);
TimeUnit.SECONDS.sleep(value);
}
6. 现在, 创建例子主类通过创建 Main 类和实现 main() 方法.
public class Main {
public static void main(String[] args) {
7. 首先, 创建一个 ThreadGroup 对象命名 Searcher.
`ThreadGroup threadGroup = new ThreadGroup("Searcher");` 8. 然后, 创建 一个 SearchTask 对象和 一个 Result 对象。
Result result=new Result();
SearchTask searchTask=new SearchTask(result);
9. 现在, 使用SearchTask对象创建 10个 Thread o对象。当你调用Thread 类的构造函数时,传递它作为ThreadGroup对象的第一个参数。
for (int i=0; i i++) {
Thread thread=new Thread(threadGroup, searchTask);
thread.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
10. 使用list() 方法写关于 ThreadGroup ob对象信息。
System.out.printf("Number of Threads: %dn",threadGroup. activeCount());
System.out.printf("Information about the Thread Groupn");
threadGroup.list();
11. 使用 activeCount() 和 enumerate() 方法来获取线程个数和与ThreadGroup对象关联的线程的列表。我们可以用这个方法来获取信息, 例如,每个线程状态。
threadGroup.enumerate(threads);
for (int i=0; i
System.out.printf("Thread %s: %sn",threads[i].getName(),threads[i].getState());
}
12. 调用 waitFinish()方法. 我们等下来实现这方法。它会等待ThreadGroup对象中的其中一个线程结束。
14. 实现 waitFinish() 方法. 它会使用 activeCount() 方法来控制到最后一个线程。
private static void waitFinish(ThreadGroup threadGroup) {
while (threadGroup.activeCount() 9) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
15. 运行例子并查看结果。 它是怎么工作的… 在下面的截图内, 你可以发现 list() 方法 的输出和当我们把每个线程对象的状态写入时候的输出, 请看截图:
ThreadGroup 类储存线程对象和其他有关联的 ThreadGroup 对象,所以它可以访问他们的所有信息 (例如,状态) 和全部成员的操作表现 (例如,中断)。 ThreadGroup 类有很多方法. 查看 API 文档里的这些方法的详细说明。
异步任务AsyncTask 源码 地址http://androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/android/os/AsyncTask.java 最近在Android开发上遇到线程遇到诸多问题,特此记录下。
相关文章
- 深入Java线程管理(一):线程的实现方式
- 线程池运用实例——一次错误的多线程程序设计以及修复过程
- 线程管理(七)守护线程的创建和运行
- 线程管理(六)等待线程的终结
- 线程管理(四)操作线程的中断机制
- 线程管理(十)线程组
- 线程管理(三)线程的中断
- 线程管理(一)线程的创建和运行
- 线程管理(十一)处理线程组内的不受控制异常
- 线程间共享数据无需竞争
- Python3 threading的多线程管理中的线程管理与锁
- java使用Executor(执行器)管理线程
- Java多线程学习篇——线程的开启
- android 进程和线程管理
- 进程、线程和协程之间的区别和联系
- MySQL运维---从库线程管理及故障案例
- 线程池中shutdown()和shutdownNow()方法的区别
- 银行取款[多线程]{使用ThreadLocal管理共享变量,但此场景并不保证线程同步}
- Python3 threading的多线程管理中的线程管理与锁
- C# 执行固定个数任务自行控制进入线程池的线程数量,多任务同时但是并发数据限定
- 【Linux 内核】Linux 内核特性 ( 组织形式 | 进程调度 | 内核线程 | 多平台虚拟内存管理 | 虚拟文件系统 | 内核模块机制 | 定制系统调用 | 网络模块架构 )
- 多线程设置线程超时思路
- 窗体和线程漫谈之工作线程怎样将数据的处理结果显示到窗体
- 于PsIsSystemThread无论是在线程系统线程标识获得
- Java如何使用线程解决生产者消费者问题?
- RT-Thread系列三 邂逅线程链表