`
edgar108
  • 浏览: 33418 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

ThreadPoolExecutor流程

阅读更多

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
用给定的初始参数创建新的 ThreadPoolExecutor
参数:
corePoolSize - 池中所保存的线程数,包括空闲线程。
maximumPoolSize - 池中允许的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。
threadFactory - 执行程序创建新线程时使用的工厂。
handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
抛出:
IllegalArgumentException - 如果 corePoolSize 或 keepAliveTime 小于 0,或者 maximumPoolSize 小于等于 0,或者 corePoolSize 大于 maximumPoolSize。
NullPointerException - 如果 workQueue threadFactory  handler 为 null。

FixThreadPool创建:

public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
ThreadPoolExecutor的corePoolSize和maximumPoolSize都被设置为nThreads,当线程池中的线程数大于corePoolSize时,keepAliveTime为多余的空闲线程等待新任务的最长时间,超出这个时间后多余的线程将被终止。这里把keepAliveTime设置为0L,意味着多余的空闲线程会被立刻终止。
 
ThreadPoolExecutor的  execute():
(1) 如果当前运行的线程数少于 corePoolSize,则创建新线程来执行任务。
(2) 在线程池完成预热之后(当前运行的线程数等于corePoolSize),将任务加入LinkedBlockingQueue。
(3) 线程执行完1中的任务后,会在循环中反复从LinkedBlockingQueue获取任务来执行。
 
 
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true)) //addWorker 创建任务并start
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) { //等于corePoolSize后加入队列
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
}
addWorker方法创建worker,即实际工作线程,当实际工作线程达到corePoolSize后,不再创建worker,后续的任务加入阻塞队列,现有的worker的 runWorker方法从队列中不断的获取任务。
final void runWorker(Worker w) {
Thread wt = Thread.currentThread();
Runnable task = w.firstTask;
w.firstTask = null;
w.unlock(); // allow interrupts
boolean completedAbruptly = true;
try {
while (task != null || (task = getTask()) != null) {
w.lock();
// If pool is stopping, ensure thread is interrupted;
// if not, ensure thread is not interrupted. This
// requires a recheck in second case to deal with
// shutdownNow race while clearing interrupt
if ((runStateAtLeast(ctl.get(), STOP) ||
(Thread.interrupted() &&
runStateAtLeast(ctl.get(), STOP))) &&
!wt.isInterrupted())
wt.interrupt();
try {
beforeExecute(wt, task);
Throwable thrown = null;
try {
task.run();
} catch (RuntimeException x) {
thrown = x; throw x;
} catch (Error x) {
thrown = x; throw x;
} catch (Throwable x) {
thrown = x; throw new Error(x);
} finally {
afterExecute(task, thrown);
}
} finally {
task = null;
w.completedTasks++;
w.unlock();
}
}
completedAbruptly = false;
} finally {
processWorkerExit(w, completedAbruptly);
}
}
FixThreadPool 使用无界队列LinkedBlockingQueue作为线程池的工作队列(容量为Integer.MAX_VALUE),使用无界队列会:
(1) 当线程池中的线程数达到corePoolSize后,新任务将在无界队列中等待,因此线程池中的线程数不会超过corePoolSize。
(2) 由于第一点,maximumPoolSize和 keepAliveTime是无效的参数。
(3) 由于使用无界队列,运行中的FixedThreadPool(未执行方法shutdown()或shutdownNow()) 不会拒绝任务(不会调用RejectedExecutionHandler.rejectedExecution 方法)

 

分享到:
评论

相关推荐

    ThreadPoolExecutor源码解析.pdf

    了解ThreadPoolExecutor的这些核心概念和工作流程,能帮助开发者更好地调整线程池参数,优化并发性能,以及在系统出现问题时进行排查和定位。在实际开发中,合理配置线程池参数,避免线程池过载,是保障系统稳定运行...

    ThreadPoolExecutor运转机制介绍

    #### 二、ThreadPoolExecutor 的运作流程 1. **当池子大小小于 corePoolSize 时**:创建新的线程来处理新提交的任务。 2. **当池子大小等于 corePoolSize 时**:如果还有新任务提交,但所有核心线程都在执行任务,...

    Java并发编程之ThreadPoolExecutor详解与实战

    通过实例演示了如何利用ThreadPoolExecutor构建高效稳定的线程池,并解析了线程池内部运作流程、线程回收机制等方面的知识。 适合人群:对Java语言有一定了解的技术人员,特别是希望提高程序性能和服务质量的软件...

    JDK之ThreadPoolExecutor源码分析1

    本文将深入解析ThreadPoolExecutor的execute()方法执行流程,以帮助我们理解线程池的工作原理。 当一个任务被提交到线程池,线程池的执行策略主要分为四步: 1. 首先,线程池会检查当前的核心线程数是否已达到设定...

    使用线程池ThreadPoolExecutor 抓取论坛帖子列表

    在源码分析方面,`ThreadPoolExecutor`的工作流程主要包括: 1. 如果当前线程数小于核心线程数,会立即创建新线程执行任务。 2. 如果当前线程数等于核心线程数,任务会被放入任务队列。 3. 如果任务队列已满且线程数...

    说说你对ThreadPoolExecutor的理解.docx

    ThreadPoolExecutor是Java并发编程中非常重要的一个组件,它位于`java.util.concurrent`包下,用于管理线程资源,实现线程池服务。线程池通过有效地控制并发执行的任务数量,可以提高系统的性能和稳定性。 ...

    java 中ThreadPoolExecutor原理分析

    ThreadPoolExecutor 的工作流程可以分为以下几个步骤: 1. 任务提交:用户提交一个任务到线程池中。 2. 任务队列:任务被添加到线程池中的任务队列中。 3. 线程池管理:ThreadPoolExecutor 根据当前线程池的状态和...

    11-线程池ThreadPoolExecutor底层原理源码分析(上)-周瑜.pdf

    根据提供的文件信息,我们可以深入探讨线程池`ThreadPoolExecutor`的工作原理及其实现细节,同时也会涉及并发编程中的一些关键概念和技术。 ### 线程池`ThreadPoolExecutor`概述 `ThreadPoolExecutor`是Java中非常...

    java中ThreadPoolExecutor常识汇总

    ThreadPoolExecutor 的工作流程可以分为以下四步: 1. 向线程池中添加任务,当任务数量少于 corePoolSize 时,会自动创建线程来处理这些任务 2. 当添加任务数大于 corePoolSize 且少于 maximumPoolSize 时,不再...

    Android之线程池ThreadPoolExecutor的简介

    执行流程: 当线程数小于corePoolSize时,每添加一个任务,则立即开启线程执行 当corePoolSize满的时候,后面添加的任务将放入缓冲队列workQueue等待 当workQueue也满的时候,看是否超过maximumPoolSize线程数,...

    流量管理流程文档

    Java的ExecutorService接口和ThreadPoolExecutor类提供了创建和管理线程池的功能,可以根据系统资源动态调整线程数量。 其次,描述中的“常用文档”可能涉及到各种技术规范和操作指南,如需求文档、设计文档、测试...

    线程池顶层实现原理之线程模型,状态,执行流程,原理

    ThreadPoolExecutor 构造函数的参数包括: * corePoolSize:核心线程数。 * maximumPoolSize:最大线程数。 * keepAliveTime:保持活动时间。 * unit:时间单位。 * workQueue:任务队列。 * threadFactory:线程...

    源码深度分析线程池中Worker线程的执行流程

    本文将深入分析Worker线程的执行流程,特别是其源码实现。 首先,Worker类是ThreadPoolExecutor的一个内部类,它继承了AbstractQueuedSynchronizer(AQS),这是一个抽象的同步队列,用于实现锁和其他同步组件的...

    RocketMq事务消息发送代码流程详解

    ExecutorService executorService = new ThreadPoolExecutor(2, 5, 100, TimeUnit.SECONDS, new ArrayBlockingQueue(2000), new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread ...

    android多功能音乐播放器设计-学位论文.doc

    系统架构图和流程图是用于描述音乐播放器应用程序的系统架构和流程的图形化表示。系统架构图描述了系统的总体架构,流程图描述了系统的流程和交互。 知识点:系统架构图、流程图、音乐播放器应用程序、系统架构、...

    自定义实现Java线程池1-模拟jdk线程池执行流程1

    本篇将探讨如何模拟Java的JDK线程池执行流程,以理解其设计原理。核心知识点包括线程池的执行策略、接口设计以及异常处理。 首先,Java中的线程池设计始于JDK 5.0,主要通过`java.util.concurrent`包中的`Executor`...

    01.java并发编程面试宝典

    ThreadPoolExecutor 的工作流程是: 1. 提交任务时,线程池会检查是否有空闲线程,如果有,则将任务分配给空闲线程 2. 如果没有空闲线程,则创建新的线程执行任务 3. 如果线程池已经达到最大线程数,则执行拒绝策略...

    线程池之Executor框架.docx

    2. **Executor框架的工作流程** - 主线程创建任务,通常是实现`Runnable`或`Callable`的实例。 - 创建`ExecutorService`的实现,如`ThreadPoolExecutor`或`ScheduledThreadPoolExecutor`,并通过`execute()`或`...

    java 线程池实现多并发队列后进先出

    1. **线程池的工作流程** - **提交任务**:当一个任务被提交到线程池时,它会被放入工作队列。 - **获取任务**:空闲线程会从工作队列中取出任务并执行。 - **线程调度**:如果所有线程都在忙碌,新任务会被阻塞...

Global site tag (gtag.js) - Google Analytics