测试并发应用(三)监控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 值。
目录
相关文章
|
2天前
|
Java 测试技术 持续交付
自动化测试框架选型与实战:深入探索与应用
【5月更文挑战第8天】本文探讨了自动化测试框架的选型与实战应用,强调了其在软件质量保障中的重要性。选型原则包括考虑项目需求、技术栈、可扩展性和可维护性,以及社区支持和文档。介绍了Selenium、Appium、JUnit和Pytest等常用框架,并概述了实战应用的步骤,包括明确需求、搭建环境、编写测试用例、执行测试、分析结果、维护代码和持续集成。合理选型与实践能提升测试效率,保障项目成功。
|
3天前
|
JSON 前端开发 JavaScript
快照测试在前端自动化测试中的应用
在前端自动化测试中,快照测试常用于检验组件渲染与布局。
|
5天前
|
敏捷开发 JavaScript 测试技术
深入理解与应用软件测试中的Mock技术
【5月更文挑战第5天】 在现代软件开发过程中,单元测试作为保障代码质量的重要环节,其独立性和可靠性至关重要。Mock技术应运而生,为开发者提供了一种在隔离环境下模拟外部依赖的方法。本文将深入探讨Mock技术的概念、实现方式及其在软件测试中的应用,旨在帮助读者更好地理解和运用这一强大的测试工具,以提升测试效率和软件质量。
|
8天前
|
安全 IDE Java
Java串口通信技术探究2:RXTX库单例测试及应用
Java串口通信技术探究2:RXTX库单例测试及应用
25 4
|
8天前
|
数据采集 机器学习/深度学习 人工智能
探索AI在软件测试中的应用与挑战
【5月更文挑战第2天】本文将探讨人工智能(AI)在软件测试领域的应用及其带来的挑战。我们将详细讨论AI如何改变软件测试的方式,包括自动化测试、预测性测试、智能化缺陷检测等。同时,我们也将探讨AI在软件测试中面临的挑战,如数据质量问题、模型的可解释性、以及对现有测试流程的影响等。
|
10天前
|
Java 测试技术 开发者
深入理解与应用单元测试:软件质量的守护者
【4月更文挑战第30天】 在现代软件开发过程中,单元测试作为保障代码健康的重要环节,其地位日益凸显。本文将探讨单元测试的核心概念、实施单元测试的重要性以及如何高效地设计并执行单元测试。通过实例分析,我们将揭示单元测试在确保软件产品质量和加速开发周期中的关键作用。
|
10天前
|
敏捷开发 测试技术 持续交付
探索自动化测试在敏捷开发中的应用移动应用的未来:跨平台开发与操作系统的融合
【4月更文挑战第30天】随着软件开发周期的不断缩短,传统的软件测试方法逐渐显得力不从心。本文将深入探讨自动化测试在敏捷开发环境中的关键作用,分析其如何提高测试效率、减少人力资源成本,并确保软件产品的质量与稳定性。通过案例分析,我们还将讨论实施自动化测试的最佳实践和面临的挑战,为追求高效敏捷开发的组织提供参考。
|
10天前
|
数据采集 机器学习/深度学习 人工智能
自动化测试中AI辅助技术的应用与挑战
【4月更文挑战第30天】随着人工智能(AI)技术的飞速发展,其在软件自动化测试领域的应用日益增多。本文探讨了AI辅助技术在自动化测试中的应用情况,包括智能化测试用例生成、测试执行监控、缺陷预测及测试结果分析等方面。同时,文章还分析了在融合AI技术时所面临的挑战,如数据质量要求、模型的透明度与解释性问题以及技术整合成本等,并提出了相应的解决策略。
|
10天前
|
机器学习/深度学习 算法 UED
【Python 机器学习专栏】A/B 测试在机器学习项目中的应用
【4月更文挑战第30天】A/B测试在数据驱动的机器学习项目中扮演关键角色,用于评估模型性能、算法改进和特征选择。通过定义目标、划分群组、实施处理、收集数据和分析结果,A/B测试能帮助优化模型和用户体验。Python提供工具如pandas和scipy.stats支持实验实施与分析。注意样本量、随机性、时间因素和多变量分析,确保测试有效性。A/B测试助力于持续改进机器学习项目,实现更好的成果。
|
10天前
|
前端开发 IDE 数据可视化
深入理解与应用自动化测试框架Selenium的最佳实践
【4月更文挑战第30天】 本文将深入剖析自动化测试框架Selenium的核心原理,并结合最佳实践案例,探讨如何有效提升测试覆盖率和效率。文中不仅涉及Selenium的架构解析,还将提供针对性的策略来优化测试脚本,确保测试流程的稳定性与可靠性。通过实例演示,读者可以掌握如何在不同测试场景中灵活运用Selenium,以及如何处理常见的技术挑战。

热门文章

最新文章