ThreadPoolExecutor 简介

ThreadPoolExecutor 是线程池类。

通俗的讲,它是一个存放一定数量线程的线程集合。线程池允许多个线程同时运行,同时运行的线程数量就是这个线程池的容量,也会有一部分线程出现阻塞,线程池此时也会通过响应的拒绝策略来处理。

构造函数参数说明

  • corePoolSize:池中所保存的线程数,包括空闲线程
  • maximumPoolSize:池中允许的最大线程数
  • keepAliveTime:当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间
  • unit:keepAliveTime 参数的时间单位
  • workQueue:执行前用于保持任务的队列(被提交但尚未执行的任务)。此队列仅保存由 execute 方法提交的 Runable 任务
  • threadFactory:执行程序创建新线程时使用的工厂
  • handler:拒绝策略,由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序

corePoolSize  与 maximumPoolSize 的关系

如果运行线程数少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队;

如果运行的线程大于等于 corePoolSize,则 Executor 始终首选将请求加入阻塞队列,而不添加新的线程;

如果无法将请求加入队列,则创建新的线程,如果创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝;

如果设置的 corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池。如果将 maximumPoolSize 设置为基本的无界值(Integer.MAX_VALUE),则允许池适应任意数量的并发任务,直到内存耗尽。在大都数情况下,核心池大小和最大池大小在创建线程池时设置,不过也可以通过 setCorePoolSize() 和 setMaximumPoolSize() 进行动态更改。

ThreadPoolExecutor 的数据结构

  • workers:workers 为 HashSet<Worker> 类型。一个 Worker 对应一个线程,线程池通过 workers 包含了多个线程。当线程池启动时,它会执行线程池中的任务,执行完后,它会从线程池的阻塞队列中取出阻塞任务来执行。线程池通过它实现了“允许多线程同时运行”
  • workQueue:workQueue 为 BlockingQueue<Runnable> 阻塞队列类型。当线程池中的线程数超过它的容量时,线程会进入阻塞队列进行阻塞等待。线程池通过它实现了线程阻塞功能
  • mainLock:Condition 类型,通过它实现了线程池的互斥访问
  • corePoolSize:核心池大小
  • maximumPoolSize:最大池大小
  • poolSize:当前线程池的实际大小,即线程池中的任务数量

线程池通过 workers 集合来管理多线程,线程启动后,就会执行对应的任务。任务执行完毕后,它会从阻塞队列中取出任务继续执行。阻塞队列负责管理线程池来不及处理的任务,当添加线程池被添加到最大线程池大小时,就会执行拒绝策略(handler),来处理当前提交但被拒绝的任务。

Java多线程系列——线程池原理之 ThreadPoolExecutor的更多相关文章

  1. Java多线程系列——线程池简介

    什么是线程池? 为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用.用线程时从线程池中获取,用完以后不销毁线程,而是归还给线程池. JDK 对线程池的支持 为了更好的控制多线程,JDK 提 ...

  2. java多线程:线程池原理、阻塞队列

    一.线程池定义和使用 jdk 1.5 之后就引入了线程池. 1.1 定义 从上面的空间切换看得出来,线程是稀缺资源,它的创建与销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,创建线程需 ...

  3. java并发包&线程池原理分析&锁的深度化

          java并发包&线程池原理分析&锁的深度化 并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的, ...

  4. Java多线程与线程池技术

    一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...

  5. Java 多线程:线程池

    Java 多线程:线程池 作者:Grey 原文地址: 博客园:Java 多线程:线程池 CSDN:Java 多线程:线程池 工作原理 线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时: ...

  6. Java 多线程之线程池的使用

    一. 使用背景 谈到Java多线程,我们很自然的会想到并发,在编写多线程代码时,我们一般会创建多个线程,如果并发的线程数量很多,而且每个线程都是执行一个时间很短的任务就结束了,这样频繁的进行线程的创建 ...

  7. java多线程、线程池及Spring配置线程池详解

    1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源.2.java中简单的实现多线程的方式 继承Thread ...

  8. Java并发包--线程池原理

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509954.html 线程池示例 在分析线程池之前,先看一个简单的线程池示例. 1 import jav ...

  9. Java多线程之线程池详解

    前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...

随机推荐

  1. Windows 7 Boot Updater 如何使用

    作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com 如何使用 动画如果你选择改变动画,你将不得不 ...

  2. BZOJ.3064.CPU监控(线段树 历史最值)

    题目链接 \(Description\) 有一个长为n的序列Ai,要求支持查询[l,r]的最值.历史最值,区间加/重设 \(Solution\) 线段树,每个点再维护一个历史(从0到现在)最大值.历史 ...

  3. Chrome 浏览器的Secure Shell插件

    说起putty,windows下面的程序猿个个都是爱恨交加. 不小心发现一个宝贝,Chrome 浏览器的Secure Shell插件. 这是Google官方推出的插件,试用下来,putty完全可以下岗 ...

  4. null与“ ”

    http://blog.csdn.net/eroswang/article/details/8529817 MySQL数据库是一个基于结构化数据的开源数据库.SQL语句是mysql数据库中核心语言.不 ...

  5. Qt.Qt新安装之后出现Error while building/deploying (kit: Desktop Qt 5.7.0 GCC 64bit) When executing step "Make”

    出问题的环境: 操作系统: Ubuntu18.04 安装包: qt-opensource-linux-x64-5.8.0.run 现象: 新建一个Hello World项目, 试着运行, 出现以下提示 ...

  6. Oozie分布式工作流——Action节点

    前篇讲述了下什么是流控制节点,本篇继续来说一下什么是 Action Nodes操作节点.Action节点有一些比较通用的特性: Action节点是远程的 所有oozie创建的计算和处理任务都是异步的, ...

  7. 【转】大数据分析中Redis怎么做到220万ops

    原文:http://www.cnblogs.com/nnhy/archive/2018/01/16/Redis220.html 大数据时代,海量数据分析就像吃饭一样,成为了我们每天的工作.为了更好的为 ...

  8. anaconda3/lib/libcrypto.so.1.0.0: no version information available (required by wget)

    Solution: sudo ldconfig /lib/x86_64-linux-gnu/ #you need to use the libcrypto.so from /lib/x86_64-li ...

  9. Chart-template

    ylbtech-Chart: 1.返回顶部 1-1. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回顶部   ...

  10. 连接mysql 出现:java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.

    数据测试的时候出现: 网上查资料说的是mysql5.x 版本和 8.x版本的区别: 5.7版本是:default_authentication_plugin=mysql_native_password ...