package cn.smallbug.jdk.concurrent.exe; import java.io.Serializable; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy; import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Test; public class TestThreadPoolExecutor { private ThreadPoolExecutor pool = null; @Before public void before() { this.pool = new ThreadPoolExecutor(// /** * corePoolSize(线程池的基本大小):<br /> * 当提交一个任务到线程池时,线程池会创建一个线程来执行任务, * 即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。 * 如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程。 */ 10, /** * maximumPoolSize(线程池最大大小):<br /> * 线程池允许创建的最大线程数。如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。 * 值得注意的是如果使用了无界的任务队列这个参数就没什么效果。 */ 20, /** * keepAliveTime(线程活动保持时间):<br /> * 线程池的工作线程空闲后,保持存活的时间。 */ 1000, /** * TimeUnit(线程活动保持时间的单位):<br /> * 可选:<br /> * <ul> * <li>单位有天(DAYS)</li> * <li>小时(HOURS)</li> * <li>分钟(MINUTES)</li> * <li>毫秒(MILLISECONDS)</li> * <li>微秒(MICROSECONDS, 千分之一毫秒)</li> * <li>毫微秒(NANOSECONDS, 千分之一微秒)</li> * </ul> */ TimeUnit.MILLISECONDS, // 表示线程活动保持时间为1000ms, /** * runnableTaskQueue(任务队列):<br /> * 用于保存等待执行的任务的阻塞队列。可以选择以下几个阻塞队列: * <ul> * <li><b>ArrayBlockingQueue:</b>是一个基于数组结构的有界阻塞队列,此队列按 * FIFO(先进先出)原则对元素进行排序。</li> * <li><b>LinkedBlockingQueue:</b>一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) * 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors. * newFixedThreadPool()使用了这个队列。</li> * <li><b>SynchronousQueue:</b> * 一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作, * 否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors. * newCachedThreadPool使用了这个队列。</li> * <li><b>PriorityBlockingQueue:</b>一个具有优先级的无限阻塞队列。</li> * </ul> */ new ArrayBlockingQueue<Runnable>(100), /** * ThreadFactory:<br /> * 用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字,Debug和定位问题时非常又帮助。 */ // new CreateThread(), /** * RejectedExecutionHandler(饱和策略):<br /> * 当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。 * 这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。以下是JDK1.5提供的四种策略 * <ul> * <li>CallerRunsPolicy:只用调用者所在线程来运行任务。</li> * <li>DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。</li> * <li>DiscardPolicy:不处理,丢弃掉。</li> * <li>当然也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。 * 如记录日志或持久化不能处理的任务。</li> * </ul> */ new DiscardPolicy()// ); } /** * 线程池在创建时如果指定任务工厂execute的任务将无效 * * @timestamp Mar 19, 2016 3:08:56 PM */ @Test public void testExecute() { pool.execute(new Runnable() { @Override public void run() { System.out.println(2 + 2); } }); } /** * 线程池在创建时如果指定任务工厂execute的任务将无效 * * @timestamp Mar 19, 2016 3:11:21 PM */ @Test public void testSubmit() { int i = 100; while (i-- > 0) { pool.submit(// new Callable<Serializable>() { @Override public Serializable call() throws Exception { return 2 + 2; } }// ); } Future<Serializable> result = pool.submit(// new Callable<Serializable>() { @Override public Serializable call() throws Exception { return 2 + 2; } }// ); Serializable s = null; try { s = (int) result.get(); } catch (InterruptedException e) { // 处理中断异常 e.printStackTrace(); } catch (ExecutionException e) { // 处理无法执行任务异常 e.printStackTrace(); } finally { stastic(pool); /** * 1、将线程池的状态设置成SHUTDOWN状态<br /> * 2、然后中断所有没有正在执行任务的线程 */ pool.shutdown(); /** * 1、将线程池的状态设置成STOP<br /> * 2、遍历线程池中的工作线程<br /> * 3、逐个调用线程的interrupt方法来中断线程(无法响应中断的任务可能永远无法终止)<br /> * 4、返回等待执行任务的列表 */ // pool.shutdownNow(); /** * 只要调用了这两个关闭方法的其中一个,isShutdown方法就会返回true<br /> * 当所有的任务都已关闭后,才表示线程池关闭成功,这时调用isTerminaed方法会返回true<br /> * 通常调用shutdown来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow */ } System.out.println(s); } /** * 通过继承线程池并重写线程池的 <br /> * beforeExecute <br /> * afterExecute <br /> * terminated <br /> * 方法,可以在任务执行前, 执行后和线程池关闭前干一些事情。如监控任务的平均执行时间,最大执行时间和最小执行时间等。 * * @timestamp Mar 19, 2016 3:37:29 PM * @param pool2 */ private void stastic(ThreadPoolExecutor pool) { System.out.println("current cpu num -> " + Runtime.getRuntime().availableProcessors()); System.out.println("线程池需要执行的任务数量 -> " + pool.getTaskCount()); System.out.println("线程池在运行过程中已完成的任务数量。小于或等于taskCount -> " + pool.getCompletedTaskCount()); System.out.println("线程池曾经创建过的最大线程数量 -> " + pool.getLargestPoolSize()); System.out.println("线程池的线程数量。如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不减 -> " + pool.getPoolSize()); System.out.println("获取活动的线程数 -> " + pool.getActiveCount()); } /** * 工作任务创建工厂 * * @timestamp Mar 19, 2016 3:01:24 PM * @author smallbug */ class CreateThread implements ThreadFactory { @Override public Thread newThread(Runnable r) { return new Thread() { @Override public void run() { System.out.println(1 + 1); } }; } } }
- 首先线程池判断基本线程池是否已满?没满,创建一个工作线程来执行任务。满了,则进入下个流程。
- 其次线程池判断工作队列是否已满?没满,则将新提交的任务存储在工作队列里。满了,则进入下个流程。
- 最后线程池判断整个线程池是否已满?没满,则创建一个新的工作线程来执行任务,满了,则交给饱和策略来处理这个任务。
参考博客:聊聊并发(三)Java线程池的分析和使用
相关推荐
Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了流的概念,流是作为一种对数据执行...
Elasticsearch是一个分布式、实时的搜索和分析引擎。Java高级客户端提供了与Elasticsearch服务器通信的能力,支持复杂的查询、索引和聚合操作。它比基于HTTP的RestHighLevelClient更强大,能够更好地处理网络异常和...
【Java线程池实现】 Java通过`java.util.concurrent`包提供了线程池的实现,如`ExecutorService`接口和`ThreadPoolExecutor`类。`ThreadPoolExecutor`允许开发者自定义线程池的核心参数,如核心线程数、最大线程数...
在Java中,我们可以利用`java.util.concurrent`包中的类,如`ExecutorService`、`ThreadPoolExecutor`和`Future`来创建并管理线程池,执行并发任务。此外,`java.net.URL`和`java.net.HttpURLConnection`可以用来...
在本文件"关于Java软件的性能测试分析.pdf"中,我们可能会探讨以下几个关键知识点: 1. **性能测试目标**:性能测试的主要目标包括确定系统的负载承受能力、响应时间、并发用户数以及系统在峰值使用情况下的稳定性...
例如,Java平台提供了强大的`ExecutorService`接口以及其实现类`ThreadPoolExecutor`,使得开发者能够轻松地管理和控制线程池的行为。此外,像IBM WebSphere、IONA Orbix 2000、SUN Jini等大型企业级应用服务器也都...
综上所述,Java并发系统动态测试工具结合了Java并发编程的各种概念和机制,通过实际的代码分析和测试,帮助开发者确保他们的并发程序正确、高效地运行。理解和掌握这些知识点对于编写健壮的多线程应用至关重要。
线程池是多线程编程中的一个重要概念,它在服务器端程序中被广泛使用,以提高资源利用率和...通过分析`ThreadPoolManager`、`WorkThread`、`Task`以及`TestThreadPool`这些类,我们可以更好地理解和实现线程池的机制。
在本项目中,"星座测试系统 java实现" 是一个基于Java编程...以上就是“星座测试系统 java实现”可能涉及的主要Java技术点,每个方面都有深入学习和实践的空间,对于提升Java编程技能和理解软件开发流程都非常有帮助。
线程池是Java多线程编程中不可或缺的一部分,它通过管理一组可重用线程来提高应用程序的性能和效率。在Java中,`java.util.concurrent` 包中的 `ExecutorService` 和其子类如 `ThreadPoolExecutor` 提供了线程池的...
根据提供的文件信息,本文将对“JAVA性能测试与调优案例”进行详细的知识点解析。...通过细致地分析和调整,可以显著提高Java应用程序的性能和响应速度。文档中的案例分析和具体调优方法为实际工作提供了宝贵的参考。
性能测试的目的是评估Java服务程序在高并发环境下的运行表现,包括处理能力、响应时间和资源消耗。这通常涉及到模拟大量用户同时访问服务,以检查系统的极限性能、稳定性以及可能存在的瓶颈。 **第2章 关于JMeter的...
在腾讯的校招过程中,对于Java和测试工程师的笔试环节,通常会涵盖一系列关键的编程和技术概念。Java是互联网开发中的主流语言,而测试工程师则负责确保软件质量,因此这两个职位的笔试题会涉及到广泛的IT知识。 一...
JavaSelector在Java NIO(非阻塞I/O)中扮演着关键角色,它允许程序...为了深入了解Java Selector的并发测试,需要查看`src`目录下的源代码,分析其中的`Selector`、`SelectionKey`和`SelectableChannel`的使用情况。
MongoDB是一种流行的开源文档型数据库,以其高性能、高可扩展性和灵活性而闻名。在这个场景中,我们关注的是一个Java客户端,...通过分析和优化这个客户端,我们可以更好地理解和提升MongoDB在大规模并发应用中的表现。
线程池(如ExecutorService)和并发工具(如Semaphore)可能会在这个文件中被使用,以控制并发数量并确保测试的可控性。 再者,`Parameter.java` 文件可能是用来存储测试参数的类,比如请求的URL、并发数、测试次数...
7. **性能优化**:由于可能涉及大量数据处理,工具可能采用并发编程技术(如线程池)来提高处理速度,同时利用Java内存管理和垃圾回收机制,确保程序的稳定性和高效运行。 8. **版本控制与持续集成**:在开发过程中...
本资源提供的是一款用Java编写的网站压力测试程序,通过分析其源码,我们可以深入理解如何构建这样的工具。 1. **并发测试原理**: 并发测试是指在模拟多个用户同时访问同一网站或应用的过程,以检验服务器、...