来自:
http://blog.csdn.net/cutesource/article/details/6061229
最近发现几起对ThreadPoolExecutor的误用,其中包括自己,发现都是因为没有仔细看注释和内部运转机制,想当然的揣测参数导致,先看一下新建一个ThreadPoolExecutor的构建参数:
- public ThreadPoolExecutor(int corePoolSize,
- int maximumPoolSize,
- long keepAliveTime,
- TimeUnit unit,
- BlockingQueue<Runnable> workQueue,
- ThreadFactory threadFactory,
- RejectedExecutionHandler handler)
看这个参数很容易让人以为是线程池里保持corePoolSize个线程,如果不够用,就加线程入池直至maximumPoolSize大小,如果还不够就往workQueue里加,如果workQueue也不够就用RejectedExecutionHandler来做拒绝处理。
但实际情况不是这样,具体流程如下:
1)当池子大小小于corePoolSize就新建线程,并处理请求
2)当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去从workQueue中取任务并处理
3)当workQueue放不下新入的任务时,新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理
4)另外,当池子的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁
内部结构如下所示:
从中可以发现ThreadPoolExecutor就是依靠BlockingQueue的阻塞机制来维持线程池,当池子里的线程无事可干的时候就通过workQueue.take()阻塞住。
其实可以通过Executes来学学几种特殊的ThreadPoolExecutor是如何构建的。
- public static ExecutorService newFixedThreadPool(int nThreads) {
- return new ThreadPoolExecutor(nThreads, nThreads,
- 0L, TimeUnit.MILLISECONDS,
- new LinkedBlockingQueue<Runnable>());
- }
newFixedThreadPool就是一个固定大小的ThreadPool
- public static ExecutorService newCachedThreadPool() {
- return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
- 60L, TimeUnit.SECONDS,
- new SynchronousQueue<Runnable>());
- }
newCachedThreadPool比较适合没有固定大小并且比较快速就能完成的小任务,没必要维持一个Pool,这比直接new Thread来处理的好处是能在60秒内重用已创建的线程。
其他类型的ThreadPool看看构建参数再结合上面所说的特性就大致知道它的特性
分享到:
相关推荐
本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要理解Java线程池的核心类`java.util.concurrent.ThreadPoolExecutor`,它是所有自定义...
Linux C++线程池封装框架是一种高效的多线程执行机制,它通过高度抽象化和动态伸缩性,降低了线程创建和销毁的开销,...理解并正确使用线程池框架是提升C++程序性能的关键,同时也需要注意线程间同步带来的额外开销。
综上所述,"线程池画风筝动态效果"项目是一个很好的实战案例,它结合了线程池的管理和并发处理,以及图形用户界面的实时更新,帮助我们更好地理解和运用这些技术。通过学习和实践此类项目,开发者可以提升自己在多...
深入理解CLR的工作原理,特别是其线程管理机制,对于提升开发者的技能至关重要。 #### 二、MSIL(中间语言) - **定义**:MSIL是一种与硬件无关的指令集,由.NET编译器生成,旨在由JIT(Just-In-Time,即时)...
例如,知道如何正确配置线程池大小、理解线程池的状态转换机制、了解任务调度过程,都是保证系统稳定运行的关键。在实际开发中,结合`ThreadPoolExecutor`的其他方法,如`execute()`、`shutdown()`、`shutdownNow()`...
本文将围绕“鱼刺线程池”和“拨号重试框架”的源码进行深入探讨,旨在帮助开发者理解其内部机制,并能灵活应用到实际项目中。 “鱼刺线程池”(FishingSpine ThreadPool)是一种高效、灵活的线程池实现,它借鉴了...
jdbc 的作用图是指 jdbc 在 Java 程序和数据库之间的中间件角色,负责将 Java 程序的请求转换为数据库可以理解的 SQL 语句,并将数据库的响应结果返回给 Java 程序。 二、jdbc 程序访问数据的步骤 jdbc 程序访问...
首先,我们要理解线程池的概念。线程池是Java多线程编程中的一种高级用法,它可以预先创建一定数量的线程,避免每次任务提交时都需要创建新线程的开销。这有助于提高系统的响应速度和处理能力,尤其是在高并发环境下...
首先,让我们理解什么是Socket。Socket是网络编程中的一个概念,它在应用程序与网络协议之间提供了一种接口,允许程序通过TCP/IP协议进行通信。Socket分为服务器端Socket(Server Socket)和客户端Socket(Client ...
首先,我们需要理解Java的Socket编程,它是网络通信的基础。Socket提供了进程间的通信机制,使得运行在不同机器上的程序能够通过网络交换数据。在聊天室中,每个用户连接到服务器都会创建一个Socket,用于发送和接收...
通过阅读和分析这段代码,你可以更深入地理解如何在实际项目中结合Boost线程池和OpenCV来处理图像。 在Windows环境下,Boost库和OpenCV库都需要正确配置和链接。对于Boost,你需要下载库文件并将其添加到项目的编译...
2. **创建线程池**:使用Java的ExecutorService,我们可以创建一个线程池来管理多个转换线程。线程池可以有效地管理和调度线程,避免过度创建和销毁线程的开销。 3. **定义转换逻辑**:创建一个Runnable或Callable...
本项目提供了一个关于“Linux C语言线程池、状态机和并发处理”的Demo,非常适合初学者理解和实践多线程技术。下面将详细阐述这些知识点。 首先,线程池是一种线程管理机制,它预先创建了一组线程,待有任务需要...
标题中的“三个分别由单线程、多线程、线程池实现的简单网关”涉及到的是并发处理的三种常见模型。在IT行业中,尤其是在服务器端编程和高性能系统设计中,如何有效...这为理解和优化并发处理、网关设计提供了实践案例。
理解这些状态及其转换对于有效管理和控制线程至关重要。 通过以上解析,我们可以看出多线程技术不仅能够提高程序的执行效率,还能够增强程序的健壮性和可维护性。掌握多线程的基础概念和技术细节对于开发高质量的...
在Android开发中,异步加载图像是一项至关重要的技术,它能确保用户界面的流畅性,避免...通过理解这些核心概念,你可以根据项目需求选择合适的解决方案,无论是使用现有的图像加载库,还是自定义实现,都能游刃有余。
总的来说,理解线程、线程池以及TCP协议的长连接和短连接特性是软件开发中不可或缺的基础知识。熟练掌握这些概念,有助于编写出更高效、更稳定的程序。学习和实践这些基础,将为你的编程生涯打下坚实的基础。
本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)多线程线程池”的应用,结合具体的代码实例来帮助理解这些概念。 首先,多线程是指在一个程序中同时执行多个不同的线程,以实现并行处理。在...
线程池是一种多线程管理机制,它可以预先创建一定数量的线程,当有任务需要执行时,从池中分配一个空闲线程来处理,任务完成后线程返回池中等待新的任务。这种方式避免了频繁创建和销毁线程的开销,提高了系统资源...
理解并掌握线程的状态转换对于理解和解决并发问题至关重要。Java线程有六种状态:新建、可运行、运行、阻塞、等待和终结。 1. **新建**:线程对象创建但尚未调用`start()`方法时,线程处于新建状态。此时,它还没有...