测试并发应用(三)监控Executor框架
声明:本文是《 Java 7 Concurrency Cookbook 》的第八章, 作者: Javier Fernández González 译者:郑玉婷
监控Executor框架
Executor 框架提供从线程的创建和管理来分别实现任务来执行这些任务的机制。如果你使用一个执行者,你只需要实现 Runnable 对象并把他们发送给执行者。 执行者的责任是管理线程。当你发一个任务给执行者,它会尝试使用pooled线程来执行这个任务,来避免创建新的任务。此机制由 Executor 接口提供,它是以 ThreadPoolExecutor 类来实现的。
在这个指南,你将学习从ThreadPoolExecutor执行者可以获取的信息和如何获取这些信息。
准备
指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。
怎么做呢…
按照这些步骤来实现下面的例子::
01
|
//1. 创建一个类,名为 Task,并实现 Runnable 接口.
|
02
|
public class Task implements Runnable {
|
03
|
04
|
//2. 声明一个私有 long 属性,名为 milliseconds.
|
05
|
private long milliseconds;
|
06
|
07
|
//3. 实现类的构造函数,初始化它的属性。
|
08
|
public Task ( long milliseconds) {
|
09
|
this .milliseconds=milliseconds;
|
10
|
}
|
11
|
12
|
//4. 实现 run() 方法。通过 milliseconds 属性让线程进入一段时间休眠。
|
13
|
@Override
|
14
|
public void run() {
|
15
|
System.out.printf( "%s: Begin\n" ,Thread.currentThread(). getName());
|
16
|
try {
|
17
|
TimeUnit.MILLISECONDS.sleep(milliseconds);
|
18
|
} catch (InterruptedException e) {
|
19
|
e.printStackTrace();
|
20
|
}
|
21
|
System.out.printf( "%s: End\n" ,Thread.currentThread(). getName());
|
22
|
}
|
23
|
24
|
//5. 创建例子的主类通过创建一个类,名为 Main 并添加 main()方法。
|
25
|
public class Main {
|
26
|
27
|
public static void main(String[] args) throws Exception {
|
28
|
29
|
//6. 使用Executors类的newCachedThreadPool()方法创建新的 Executor 对象。
|
30
|
ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors. newCachedThreadPool();
|
31
|
32
|
//7. 创建并提交10个 Task 对象给执行者。用随机数字初始化任务。
|
33
|
Random random= new Random();
|
34
|
for ( int i= 0 ; i< 10 ; i++) {
|
35
|
Task task= new Task(random.nextInt( 10000 ));
|
36
|
executor.submit(task);
|
37
|
}
|
38
|
39
|
//8. 创建迭代为5的for循环。在每步,传递执行者调用 showLog() 方法写相关信息,并让线程休眠1秒。
|
40
|
for ( int i= 0 ; i< 5 ; i++){
|
41
|
showLog(executor);
|
42
|
TimeUnit.SECONDS.sleep( 1 );
|
43
|
}
|
44
|
45
|
//9. 使用 shutdown() 方法关闭执行者。
|
46
|
executor.shutdown();
|
47
|
48
|
//10. 另创建迭代为5的for循环。在每步,传递执行者调用 showLog() 方法写相关信息,并让线程休眠1秒。
|
49
|
for ( int i= 0 ; i< 5 ; i++){
|
50
|
showLog(executor);
|
51
|
TimeUnit.SECONDS.sleep( 1 );
|
52
|
}
|
53
|
54
|
//11. 使用 awaitTermination() 方法等待执行者的终结。
|
55
|
executor.awaitTermination( 1 , TimeUnit.DAYS);
|
56
|
57
|
//12. 显示一条结束程序的信息。
|
58
|
System.out.printf( "Main: End of the program.\n" );
|
59
|
}
|
60
|
61
|
//13. 实现 showLog() 方法,接收 Executor 作为参数。写关于pool的大小,任务的数量,和执行者状态的信息。
|
62
|
private static void showLog(ThreadPoolExecutor executor) {
|
63
|
System.out.printf( "*********************" );
|
64
|
System.out.printf( "Main: Executor Log" );
|
65
|
System.out.printf( "Main: Executor: Core Pool Size:%d\n" ,executor.getCorePoolSize());
|
66
|
System.out.printf( "Main: Executor: Pool Size: %d\n" ,executor. getPoolSize());
|
67
|
System.out.printf( "Main: Executor: Active Count:%d\n" ,executor.getActiveCount());
|
68
|
System.out.printf( "Main: Executor: Task Count: %d\n" ,executor. getTaskCount());
|
69
|
System.out.printf( "Main: Executor: Completed Task Count:%d\n" ,executor.getCompletedTaskCount());
|
70
|
System.out.printf( "Main: Executor: Shutdown: %s\n" ,executor. isShutdown());
|
71
|
System.out.printf( "Main: Executor: Terminating:%s\n" ,executor.isTerminating());
|
72
|
System.out.printf( "Main: Executor: Terminated: %s\n" ,executor. isTerminated());
|
73
|
System.out.printf( "*********************\n" );
|
74
|
}
|
它是如何工作的…
在这个指南里,你实现了一个任务,它对它的执行线程进行了一段随机毫秒数的阻塞。然后,你发送10个任务给执行者,并且当你正在等待它们的终结的同时,你已经把关于执行者的状态的信息写入到操控台。你使用了以下的方法来获取 Executor 对象的状态:
- getCorePoolSize(): 此方法返回一个int数,表示线程的核心数。它是当执行者没有执行任何任务时,在内部线程池的线程数。
- getPoolSize(): 此方法返回一个int数,表示内部线程池的真实大小。
- getActiveCount(): 此方法返回一个int数,表示当前执行任务的线程数。
- getTaskCount(): 此方法返回一个long数,表示已经分配执行的任务数。
- getCompletedTaskCount(): 此方法返回一个long数,表示已经被这个执行者执行并结束执行的任务数。
- isShutdown(): 当 执行的 shutdown() 方法被调用来结束执行时,此方法返回 Boolean 值。
- isTerminating(): 当执行者正在操作shutdown(),但是还没结束时,此方法返回 Boolean 值。
- isTerminated(): 当这个执行者结束执行时,此方法返回 Boolean 值。
测试并发应用(三)监控Executor框架相关推荐
- [并发编程] - Executor框架#ThreadPoolExecutor源码解读01
文章目录 Pre Thread Java线程与OS线程 生命状态 状态切换 线程池 why use case Advantage Executor框架 ThreadPoolExecutor 源码分析 ...
- 线程池框架_Java并发——Executor框架详解(Executor框架结构与框架成员)
一.什么是Executor框架? 我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等.线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1 ...
- Java并发——Executor框架详解(Executor框架结构与框架成员)
一.什么是Executor框架? 我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等.线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1 ...
- 转: java并发编程-Executor框架
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...
- Java 并发编程——Executor框架和线程池原理
Java 并发编程系列文章 Java 并发基础--线程安全性 Java 并发编程--Callable+Future+FutureTask java 并发编程--Thread 源码重新学习 java并发 ...
- [并发编程] - Executor框架#ThreadPoolExecutor源码解读02
文章目录 Pre 线程池的具体实现 线程池的创建 参数解读 corePoolSize maximumPoolSize keepAliveTime unit workQueue threadFactor ...
- 并发新特性—Executor 框架与线程池
Executor 框架简介 在 Java 5 之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor 框架便是 Java 5 中引入的,其内部使用了线程池机制,它在 java.ut ...
- Java并发编程实战————Executor框架与任务执行
引言 本篇博客介绍通过"执行任务"的机制来设计应用程序时需要掌握的一些知识.所有的内容均提炼自<Java并发编程实战>中第六章的内容. 大多数并发应用程序都是围绕&qu ...
- Java并发编程(08):Executor线程池框架
本文源码:GitHub·点这里 || GitEE·点这里 一.Executor框架简介 1.基础简介 Executor系统中,将线程任务提交和任务执行进行了解耦的设计,Executor有各种功能强大的 ...
最新文章
- c语言删除偶数号节点,第十二周作业
- 除了海思麒麟 华为在ARM芯片上还有哪些成就?
- 收敛速度更快更稳定的Wasserstein GAN(WGAN)
- 第十七届智能车竞赛研讨会
- DeepMind用ReinforcementLearning玩游戏
- matlab的离散求导,高手留步:MATLAB五阶拟合函数,求导后离散化,输出结果是星号...
- keepalived详解和实战
- 2017年10月份计算机网络管理,2017年下半年网络管理员考试上午试题及答案
- 使用Pycharm进行代码对比的方法
- 七、树莓派做Aria2下载机
- RH124-07 管理与监控Linux进程
- 程序员七夕表白方法来了,带走!
- 在Android上修改读取IMEI码的方法
- 赶时间发布 ChatGPT 竞品后,Google 遭员工反讽:太仓促、拙劣、非 Google Style
- 输入直角三角形的两个直角边的长度 a、b,求斜边 c 的长度。
- H5新增input属性值
- SAP CRM 如何高效debug 查看BOL的值
- drools规则引擎动态配置规则
- 348、弱电工程FTTH光纤入户施工全过程讲解,看完这一篇就够了
- linux安装五笔输入法centos,centos7.2安装五笔输入法的方法(king已测)
热门文章
- 淮海工学院计算机组成原理,淮海工学院1112-1计算机组成原理试卷A.doc
- android功能导航布局,安卓9.0新功能 屏幕旋转将与导航栏同窗
- eclipse lombok插件安装_如果你是Java架构师或项目经理,项目技术会允许使用Lombok吗?
- php resultset用法,PHP PDOStatement::nextRowset讲解
- Linux服务器集群系统(一)—— LVS(Linux Virtual Server)简介
- 【项目管理】记第一次出差到客户现场推进项目验收感悟
- 【架构】阿里中台内容整理(部分)
- Flutter学习记录(四、Flutter项目学习列表listView)
- Angular中使用HttpClientModule模块实现get请求数据和post提交数据
- C#窗体应用设置多窗体和设置启动窗体