使用默认的 thread factory创建ThreadPoolExecutor实例

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)

例子:

//创建阻塞队列
BlockingQueue<Runnable> blockQueue = new ArrayBlockingQueue<Runnable>(20);
ThreadPoolExecutor pool = new ThreadPoolExecutor(3,5,50,TimeUnit.MILLISECONDS,blockQueue);
pool.allowCoreThreadTimeOut(false);//默认false
Runnable task = new Runnable() {
@Override
public void run() {
log.info("{}正在运行", Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
pool.execute(task); pool.shutdown();

参数解释:

corePoolSize:线程池中的核心线程数

maximumPoolSize:线程池中的最大线程数

keepAliveTime:

  • 当allowCoreThreadTimeout=false(默认)时,超过corePool的线程空闲的时间达到了keepAliveTime时间时,这些线程会超时关闭,直到线程数=corePoolSize。因此,
  • corePool的线程数,是固定的且永久有效的。即,即使当前没有需要执行的任务,也依然存活
  • 当allowCoreThreadTimeout=true时,包含corePool线程的所有线程的空闲时间达到了keepAliveTime时间时,这些线程会超时关闭,直到线程数=0。因此,
  • 线程池中的线程数<指定的corePool线程数时,当有新任务来时,即使有空闲线程,也会优先创先新线程来处理该任务,直到线程数=指定的corePool线程数。

workQueue:

  • 保存由execute方法提交的Runnable任务。
  • 阻塞队列分类:
    • ArrayBlockingQueue:FIFO。
    • LinkedBlockingQueue:FIFO。Executors.newFixedThreadPool使用该阻塞队列
    • SynchronousQueue:不存储任务。Executors.newCachedThreadPool使用该阻塞队列。

执行顺序

当线程数<指定corePool线程数时,创建线程。

当线程数>=指定corePool线程数,且任务队列未满时,将任务放入workQueue。

当线程数>=指定corePool线程数,且任务队列已满时,

  • 若线程数 < maximumPoolSize,则,创建线程
  • 若线程数 = maximumPoolSize,则,执行下边的handler,默认AbortPolicy即抛出异常。

还有1种情况会执行下边的handler,即:当执行shutdown();后,新进来的任务,就会被拒绝,此时调用handler。

handler:(ThreadPoolExecutor类中的几个内部实)

  • AbortPolicy(默认):丢弃任务,抛出RejectedExecutionException异常
  • DiscardPolicy:也是丢弃任务,但不抛出异常
  • DiscardOldestPolicy:对被拒绝的任务(新来的)不抛弃,而是抛弃队列里面等待最久的一个任务,然后把该拒绝任务加到队列
  • CallerRunsPolicy:重试添加当前被拒绝的任务,他会自动重复调用 execute() 方法,直到成功。

---------------------------最后,说下关闭

shutdown():平滑地关闭

  • 不会立即终止线程池
  • 停止接收新任务,并等待执行已提交的任务。已提交的任务=一类是已经在执行的+另一类队列中还没执行的。
  • 如果是服务器的,则不调用shutdown方法,即一直执行。

shutdownNow():立即关闭

  • 立即终止线程池
  • 停止接收新任务,已提交的任务直接打断,并清空缓存队列
  • 返回尚未执行的任务列表(Runnable List)

线程池(1)ThreadPoolExecutor梳理的更多相关文章

  1. 从源码解读线程(Thread)和线程池(ThreadPoolExecutor)的状态

    线程是比进程更加轻量级的调度执行单位,理解线程是理解并发编程的不可或缺的一部分:而生产过程中不可能永远使用裸线程,需要线程池技术,线程池是管理和调度线程的资源池.因为前不久遇到了一个关于线程状态的问题 ...

  2. Java并发编程:Java线程池核心ThreadPoolExecutor的使用和原理分析

    目录 引出线程池 Executor框架 ThreadPoolExecutor详解 构造函数 重要的变量 线程池执行流程 任务队列workQueue 任务拒绝策略 线程池的关闭 ThreadPoolEx ...

  3. 线程池 一 ThreadPoolExecutor

    java.util.concurrent public class ThreadPoolExecutor extends AbstractExecutorService ThreadPoolExecu ...

  4. 线程池之 ThreadPoolExecutor

    线程池之 ThreadPoolExecutor + 面试题 线程池介绍 线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,避免了因为线程过多而带来使用上的开销. ...

  5. 高并发之——不得不说的线程池与ThreadPoolExecutor类浅析

    一.抛砖引玉 既然Java中支持以多线程的方式来执行相应的任务,但为什么在JDK1.5中又提供了线程池技术呢?这个问题大家自行脑补,多动脑,肯定没坏处,哈哈哈... 说起Java中的线程池技术,在很多 ...

  6. 【高并发】不得不说的线程池与ThreadPoolExecutor类浅析

    大家好,我是冰河~~ 今天,我们一起来简单聊聊线程池中的ThreadPoolExecutor类,好了,不多说了,开始进入今天的正题. 一.抛砖引玉 既然Java中支持以多线程的方式来执行相应的任务,但 ...

  7. 线程池:ThreadPoolExecutor源码解读

    目录 1 带着问题去阅读 1.1 线程池的线程复用原理 1.2 线程池如何管理线程 1.3 线程池配置的重要参数 1.4 shutdown()和shutdownNow()区别 1.5 线程池中的两个锁 ...

  8. 线程池:ThreadPoolExecutor

    [ThreadPoolExecutor的使用和思考]   public ThreadPoolExecutor(int corePoolSize,                             ...

  9. Java线程池之ThreadPoolExecutor

    前言 线程池可以提高程序的并发性能(当然是合适的情况下),因为对于没有线程的情况下,我们每一次提交任务都新建一个线程,这种方法存在不少缺陷: 1.  线程的创建和销毁的开销非常高,线程的创建需要时间, ...

  10. 从源码看JDK提供的线程池(ThreadPoolExecutor)

    一丶什么是线程池 (1)博主在听到线程池三个字的时候第一个想法就是数据库连接池,回忆一下,我们在学JavaWeb的时候怎么理解数据库连接池的,数据库创建连接和关闭连接是一个比较耗费资源的事情,对于那些 ...

随机推荐

  1. 「NOIP2017」「LuoguP3952」 时间复杂度(模拟,栈

    题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...

  2. 「 JSOI2004」「LuoguP1337」平衡点 / 吊打XXX(模拟退火

    题目描述 如图:有n个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.图中X处就是公共的绳结.假设绳子是完全弹性的(不会造成能量损失),桌子足够高(因而重物不会垂到 ...

  3. Codefroces 762A k-th divisor 数论

    Codeforces 762A 题目大意: 给定两个正整数n,k\((n \le 10^{15},k\leq10^9)\),求n的从小到大的第k个约数,无解输出-1 分析: 我们会自然而然地想到找出n ...

  4. C# GUID使用总结

    全局唯一标识符(GUID,Globally Unique Identifier) What is GUID 也称作 UUID(Universally Unique IDentifier) . GUID ...

  5. Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)

    上节课复习:1.编程思想    面向过程        核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么        基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...

  6. Java中的数组和方法

    3.1 数组的定义和使用 数组(Array)是用来存储一组相同数据类型数据的集合.数组中的每个数据称为一个元素(element),数组可以分为一维数组,二维数组和多维数组.我们 主要讲解一维数组和二维 ...

  7. gcc -frandom-seed

    -frandom-seed=string This option provides a seed that GCC uses when it would otherwise use random nu ...

  8. mysql Split函数

    mysql没有split函数,这里手动写一个: ),)) BEGIN CREATE TEMPORARY TABLE IF NOT EXISTS temp_split ( col ) ); DELETE ...

  9. celery和supervisor配合使用,实现supervisor管理celery进程

    在这里我选择redis作为celery异步任务的中间人,系统选择CentOS6.5 64位.redis.celery和supervisor的安装参见官方文档. 安装完毕后: 1, 创建celery的实 ...

  10. 1、在 Windows 上安装 OpenCV-Python & ubuntu16.04安装 opencv

    Goals In this tutorial We will learn to setup OpenCV-Python in your Windows system. Below steps are ...