测试并发应用(三)监控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 值。
时间: 2023-09-28 01:52:02

测试并发应用(三)监控Executor框架的相关文章

测试并发应用(四)监控Fork/Join池

声明:本文是< Java 7 Concurrency Cookbook>的第八章, 作者: Javier Fernández González 译者:郑玉婷 监控Fork/Join池 Executor 框架提供了线程的创建和管理,来实现任务的执行机制.Java 7 包括了一个 Executor 框架的延伸为了一种特别的问题而使用的,将比其他解决方案的表现有所提升(可以直接使用 Thread 对象或者 Executor 框架).它是 Fork/Join 框架. 此框架是为了解决可以使用 divi

第八章- 测试并发应用(引言)

声明:本文是< Java 7 Concurrency Cookbook>的第八章, 作者: Javier Fernández González 译者:郑玉婷 8 测试并发应用 章节提要: 监控Lock接口 监控Phaser类 监控执行者框架 监控Fork/Join池 编写有效的日志 FindBugs分析并发代码 配置Eclipse来调试并发代码 配置NetBeans来调试并发代码 MultithreadedTC测试并发代码 介绍 测试应用是很关键的任务.在应用准备好面向最终用户之前,你必须验证

戏(细)说Executor框架线程池任务执行全过程(下)

原文链接:   首发表于infoq.com 2015年6月 上一篇文章中通过引入的一个例子介绍了在Executor框架下,提交一个任务的过程,这个过程就像我们老大的老大要找个老大来执行一个任务那样简单.并通过剖析ExecutorService的一种经典实现ThreadPoolExecutor来分析接收任务的主要逻辑,发现ThreadPoolExecutor的工作思路和我们带项目的老大的工作思路完全一致.在本文中我们将继续后面的步骤,着重描述下任务执行的过程和任务执行结果获取的过程.会很容易发现,

【PMP】Head First PMP 学习笔记 第三章 过程框架

第三章 过程框架 项目中完成的所有工作都由过程构成. 项目中的完成的所有工作都有一个模式(pattern).先计划,再去做.工作时,总是对项目与原先的计划进行比较.如果开始偏离计划,就要由你做出矫正,让一切重新走上正轨.过程框架--过程租和知识领域--正式这一切顺利完成的关键. 分阶段管理 分阶段,项目的每个阶段(phase)都会经过5个过程租,从启动到收尾,项目的多个阶段就会存在各种关联关系 顺序关系(sequenital relationship).多个阶段相继发生并不存在重叠,每个阶段在前

Java Executor 框架学习总结

大多数并发都是通过任务执行的方式来实现的.一般有两种方式执行任务:串行和并行. class SingleThreadWebServer {    public static void main(String[] args) throws Exception {      ServerSocket socket = new ServerSocket(80);      while(true) {        Socket conn = socket.accept();        handle

戏(细)说Executor框架线程池任务执行全过程(上)

原文链接   归档下发表于infoq.com 2015年6月的两篇文章. 内容综述 基于Executor接口中将任务提交和任务执行解耦的设计,ExecutorService和其各种功能强大的实现类提供了非常简便方式来提交任务并获取任务执行结果,封装了任务执行的全部过程.本文尝试通过对j.u.c.下该部分源码的解析以ThreadPoolExecutor为例来追踪任务提交.执行.获取执行结果的整个过程.为了避免陷入枯燥的源码解释,将该过程和过程中涉及的角色与我们工作中的场景和场景中涉及的角色进行映射

Clojure的并发(三)Atom、缓存和性能

Clojure 的并发(一) Ref和STM Clojure 的并发(二)Write Skew分析Clojure 的并发(三)Atom.缓存和性能 Clojure 的并发(四)Agent深入分析和Actor Clojure 的并发(五)binding和let Clojure的并发(六)Agent可以改进的地方Clojure的并发(七)pmap.pvalues和pcallsClojure的并发(八)future.promise和线程 三.Atom和缓存     Ref适用的场景是系统中存在多个相互

测试并发应用(六)用 FindBugs 分析并发代码

声明:本文是< Java 7 Concurrency Cookbook>的第八章, 作者: Javier Fernández González 译者:郑玉婷 用 FindBugs 分析并发代码 静态代码分析工具是一套通过分析应用源代码来查找潜在异常的工具.这些工具,例如 Checkstyle, PMD, 或者 FindBugs,他们有定义极好的实践(good practices) 规则,然后解析源代码来查找有没有违反这些规则.目的是在产品运行之前,更早的找到异常或者修改较差性能的代码.各种编程

jemeter测试 并发超过200 tomcat不处理请求 jemeter聚合报告卡住没有结果

问题描述 jemeter测试 并发超过200 tomcat不处理请求 jemeter聚合报告卡住没有结果 解决方案