测试并发应用(三)监控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 值。

参见

第四章,线程执行者:创建线程执行者
第七章,自定义并发类:自定义ThreadPoolExecutor类
第七章,自定义并发类:实现基于优先的执行者类

文章转自 并发编程网-ifeve.com

目录
相关文章
|
23天前
|
SQL 安全 测试技术
【软件设计师备考 专题 】测试要求说明书的编写和应用
【软件设计师备考 专题 】测试要求说明书的编写和应用
53 0
|
3天前
|
监控 测试技术 API
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第14天】在软件开发过程中,自动化测试是确保代码质量、减少人工重复劳动的关键步骤。Selenium作为一款广泛使用的自动化测试工具,提供了对多种浏览器和操作系统的支持。本文将探讨Selenium的核心组件及其架构设计,分析其如何通过WebDriver与浏览器交互,以及它如何支持多种编程语言进行脚本编写。同时,我们还将讨论Selenium Grid的作用以及它如何实现并行测试,以缩短测试周期并提高测试效率。
163 58
|
5天前
|
Web App开发 前端开发 Java
框架分析(11)-测试框架
框架分析(11)-测试框架
|
18天前
|
Web App开发 Java 测试技术
深入理解与应用软件自动化测试工具Selenium
随着软件开发的快速发展,软件测试在保证产品质量方面发挥着越来越重要的作用。其中,自动化测试以其效率高、成本低的特点受到了广大开发者的欢迎。本文主要介绍了自动化测试工具Selenium的基本概念、原理以及在实际开发中的应用,旨在帮助读者更好地理解和使用Selenium进行高效的自动化测试。
22 4
|
19天前
|
敏捷开发 设计模式 监控
深入理解自动化测试框架的设计原则
在软件开发的复杂多变环境中,自动化测试已成为确保产品质量和加速市场交付的关键步骤。本文将探讨自动化测试框架的设计原则,包括模块化、可扩展性、易用性和可靠性,旨在为软件测试工程师提供构建高效、健壮且易于维护的自动化测试系统的指导。通过分析设计模式的应用,我们将了解如何减少代码冗余,提高测试覆盖率,并适应快速变化的技术要求。
|
20天前
|
前端开发 IDE JavaScript
深入理解自动化测试框架Selenium的设计与实现
本文旨在探讨开源自动化测试框架Selenium的核心设计及其实现机制。通过分析其架构、组件和工作原理,揭示Selenium如何有效地支持跨浏览器、跨平台的自动化Web测试。文中不仅介绍了Selenium的主要功能模块,还详细讨论了其面临的挑战及应对策略,为读者提供了深入了解和使用Selenium的理论基础和实践指导。
|
24天前
|
设计模式 敏捷开发 监控
深入理解与应用软件自动化测试框架
在快速迭代的软件开发过程中,自动化测试已成为确保产品质量和加快交付速度的关键因素。本文将详细探讨自动化测试框架的核心原理、设计模式及其在实际项目中的应用。我们将分析几种流行的自动化测试工具,如Selenium、Appium和JUnit,并讨论它们如何集成以形成强大的测试解决方案。文章还将展示通过自定义框架来满足特定测试需求的实例,以及如何通过持续集成和持续部署(CI/CD)流程优化测试实践。
|
25天前
|
敏捷开发 IDE 测试技术
深入理解自动化测试框架Selenium的设计理念与实践
随着敏捷开发和持续集成的理念深入人心,自动化测试在软件开发周期中扮演着越来越重要的角色。Selenium作为一个广泛使用的自动化测试工具,其设计理念和实践对于提高测试效率和质量具有指导意义。本文将深入探讨Selenium的核心设计原则、架构以及最佳实践,旨在帮助读者构建更稳定、高效的自动化测试系统。
|
25天前
|
jenkins 测试技术 持续交付
深入理解自动化测试框架设计原则与实践
本文旨在探讨自动化测试框架的设计原则及其在实际项目中的应用。通过对自动化测试框架的系统剖析,我们揭示了有效构建和维持测试框架的核心要素,并提供了一套实用的指导方案来帮助读者实现高效、可靠的自动化测试流程。文章不仅聚焦于框架的技术细节,也强调了灵活性、可维护性和可扩展性在设计时的重要性,同时结合实际案例分析,展示了如何在不同测试环境中定制化和优化测试框架。
|
27天前
|
缓存 运维 Serverless
应用研发平台EMAS产品常见问题之测试检查更新没有反应如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。