`
libo19881179
  • 浏览: 270084 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转:线程池 理解

阅读更多

来自:

http://blog.csdn.net/cutesource/article/details/6061229

 

最近发现几起对ThreadPoolExecutor的误用,其中包括自己,发现都是因为没有仔细看注释和内部运转机制,想当然的揣测参数导致,先看一下新建一个ThreadPoolExecutor的构建参数:

 

  1. public ThreadPoolExecutor(int corePoolSize,  
  2.                           int maximumPoolSize,  
  3.                           long keepAliveTime,  
  4.                           TimeUnit unit,  
  5.                           BlockingQueue<Runnable> workQueue,  
  6.                           ThreadFactory threadFactory,  
  7.                           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是如何构建的。

 

  1. public static ExecutorService newFixedThreadPool(int nThreads) {  
  2.     return new ThreadPoolExecutor(nThreads, nThreads,  
  3.                                   0L, TimeUnit.MILLISECONDS,  
  4.                                   new LinkedBlockingQueue<Runnable>());  
  5. }  

 

newFixedThreadPool就是一个固定大小的ThreadPool

 

  1. public static ExecutorService newCachedThreadPool() {  
  2.     return new ThreadPoolExecutor(0, Integer.MAX_VALUE,  
  3.                                   60L, TimeUnit.SECONDS,  
  4.                                   new SynchronousQueue<Runnable>());  
  5. }  

 

newCachedThreadPool比较适合没有固定大小并且比较快速就能完成的小任务,没必要维持一个Pool,这比直接new Thread来处理的好处是能在60秒内重用已创建的线程。

其他类型的ThreadPool看看构建参数再结合上面所说的特性就大致知道它的特性

 

0
8
分享到:
评论

相关推荐

    java线程池的源码分析.zip

    本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要理解Java线程池的核心类`java.util.concurrent.ThreadPoolExecutor`,它是所有自定义...

    LInux c++ 线程池封转框架

    Linux C++线程池封装框架是一种高效的多线程执行机制,它通过高度抽象化和动态伸缩性,降低了线程创建和销毁的开销,...理解并正确使用线程池框架是提升C++程序性能的关键,同时也需要注意线程间同步带来的额外开销。

    线程池画风筝动态效果

    综上所述,"线程池画风筝动态效果"项目是一个很好的实战案例,它结合了线程池的管理和并发处理,以及图形用户界面的实时更新,帮助我们更好地理解和运用这些技术。通过学习和实践此类项目,开发者可以提升自己在多...

    C# CLR原理与线程池详解

    深入理解CLR的工作原理,特别是其线程管理机制,对于提升开发者的技能至关重要。 #### 二、MSIL(中间语言) - **定义**:MSIL是一种与硬件无关的指令集,由.NET编译器生成,旨在由JIT(Just-In-Time,即时)...

    线程池源码解析-多线程

    例如,知道如何正确配置线程池大小、理解线程池的状态转换机制、了解任务调度过程,都是保证系统稳定运行的关键。在实际开发中,结合`ThreadPoolExecutor`的其他方法,如`execute()`、`shutdown()`、`shutdownNow()`...

    鱼刺线程池+拨号,失败重试框架源码

    本文将围绕“鱼刺线程池”和“拨号重试框架”的源码进行深入探讨,旨在帮助开发者理解其内部机制,并能灵活应用到实际项目中。 “鱼刺线程池”(FishingSpine ThreadPool)是一种高效、灵活的线程池实现,它借鉴了...

    jdbc实现与线程池

    jdbc 的作用图是指 jdbc 在 Java 程序和数据库之间的中间件角色,负责将 Java 程序的请求转换为数据库可以理解的 SQL 语句,并将数据库的响应结果返回给 Java 程序。 二、jdbc 程序访问数据的步骤 jdbc 程序访问...

    fastdfs java客户端案例(集成线程池)

    首先,我们要理解线程池的概念。线程池是Java多线程编程中的一种高级用法,它可以预先创建一定数量的线程,避免每次任务提交时都需要创建新线程的开销。这有助于提高系统的响应速度和处理能力,尤其是在高并发环境下...

    简单实用,线程池+socket收发数据+解析字节格式报文

    首先,让我们理解什么是Socket。Socket是网络编程中的一个概念,它在应用程序与网络协议之间提供了一种接口,允许程序通过TCP/IP协议进行通信。Socket分为服务器端Socket(Server Socket)和客户端Socket(Client ...

    java聊天室,利用线程池实现多用户聊天室

    首先,我们需要理解Java的Socket编程,它是网络通信的基础。Socket提供了进程间的通信机制,使得运行在不同机器上的程序能够通过网络交换数据。在聊天室中,每个用户连接到服务器都会创建一个Socket,用于发送和接收...

    Boost线程池的例子,用opencv在线程中处理图片

    通过阅读和分析这段代码,你可以更深入地理解如何在实际项目中结合Boost线程池和OpenCV来处理图像。 在Windows环境下,Boost库和OpenCV库都需要正确配置和链接。对于Boost,你需要下载库文件并将其添加到项目的编译...

    dbf转换成xls

    2. **创建线程池**:使用Java的ExecutorService,我们可以创建一个线程池来管理多个转换线程。线程池可以有效地管理和调度线程,避免过度创建和销毁线程的开销。 3. **定义转换逻辑**:创建一个Runnable或Callable...

    Linux C语言 线程池 状态机 并发处理Demo

    本项目提供了一个关于“Linux C语言线程池、状态机和并发处理”的Demo,非常适合初学者理解和实践多线程技术。下面将详细阐述这些知识点。 首先,线程池是一种线程管理机制,它预先创建了一组线程,待有任务需要...

    三个分别由单线程 多线程 线程池实现的简单网关

    标题中的“三个分别由单线程、多线程、线程池实现的简单网关”涉及到的是并发处理的三种常见模型。在IT行业中,尤其是在服务器端编程和高性能系统设计中,如何有效...这为理解和优化并发处理、网关设计提供了实践案例。

    史上最强多线程面试44题和答案:线程锁+线程池+线程同步等

    理解这些状态及其转换对于有效管理和控制线程至关重要。 通过以上解析,我们可以看出多线程技术不仅能够提高程序的执行效率,还能够增强程序的健壮性和可维护性。掌握多线程的基础概念和技术细节对于开发高质量的...

    Android异步加载图像小结 (含线程池,缓存方法).rar

    在Android开发中,异步加载图像是一项至关重要的技术,它能确保用户界面的流畅性,避免...通过理解这些核心概念,你可以根据项目需求选择合适的解决方案,无论是使用现有的图像加载库,还是自定义实现,都能游刃有余。

    线程、线程池、TCP协议长连接短连接的基本入门知识

    总的来说,理解线程、线程池以及TCP协议的长连接和短连接特性是软件开发中不可或缺的基础知识。熟练掌握这些概念,有助于编写出更高效、更稳定的程序。学习和实践这些基础,将为你的编程生涯打下坚实的基础。

    常用多线程模板与鱼刺类多线程线程池应用小例子

    本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)多线程线程池”的应用,结合具体的代码实例来帮助理解这些概念。 首先,多线程是指在一个程序中同时执行多个不同的线程,以实现并行处理。在...

    qt客户端应用开发框架

    线程池是一种多线程管理机制,它可以预先创建一定数量的线程,当有任务需要执行时,从池中分配一个空闲线程来处理,任务完成后线程返回池中等待新的任务。这种方式避免了频繁创建和销毁线程的开销,提高了系统资源...

    面试专题-并发篇讲义.pdf

    理解并掌握线程的状态转换对于理解和解决并发问题至关重要。Java线程有六种状态:新建、可运行、运行、阻塞、等待和终结。 1. **新建**:线程对象创建但尚未调用`start()`方法时,线程处于新建状态。此时,它还没有...

Global site tag (gtag.js) - Google Analytics