`

Java线程池类ThreadPoolExecutor浅析

 
阅读更多
线程池的特点是将任务的提交和执行分开。这样做的好处是,能使处理器尽量多地同时执行任务。

为此,线程池提供了两个角色:
任务 task
执行任务的工人 worker

与此相关,需要考虑:

工人的数量:
工人数量的考量是线程池设计的一个关键。因此,这一点由构造线程池时,提供的头两个参数决定。
最小雇佣数量 corePoolSize
最多工人数量 maximumPoolSize

何时解雇多余最小雇佣数量的工人:
工人多余任务时,它们会等待任务的到来,如果规定时间内,还没有任务,那我们就解雇多余的工人。
这个规定的时间就是构造子里的第三,第四个参数。


能接受的任务数量:
一个工人,某一时间只能处理一个任务。工人的数量是有限的,因此多余工人数量的任务来了时:
线程池就要考虑是否接受
Y:
处于等待中的任务堆积到多少就不再允许接受任务 :
规定等待任务列表的容量[bound],达到容量后不再接受新任务。

无限制地接受等待任务[unbound]
设置何种任务等待列表由构造子的第五个参数决定。
long keepAliveTime, TimeUnit unit

N:
以何种方式拒绝:
由构造子的第七个参数决定。

第六个参数决定了
工人手里执行任务线程的工厂方法。


1.当工人数量没有达到最小雇佣数量时,每当任务来临,线程池都要创建一个工人,然后从线程工厂里创建一个新的线程,把任务作为该线程的target,把线程交给工人,把工人加入工人集合。该任务随即被执行。

2.如果任务来临时,当前工人数量poolSize已经大于最小雇佣数量,表明工人已经雇佣的差不多了,先让任务等待吧。
线程池尝试把任务加入任务列表,如果成功,任务提交的步骤就结束了。

2.5.任务列表是并发阻塞队列,工人会不断地尝试从队列里获取任务,如果获取到任务(请看5),工人就把任务拿去执行。这是任务的执行步骤。

3.如果加入队列失败,说明任务列表已经满了,不能再往里塞任务了。
这时,线程池判断工人数量是否达到最多工人数量。
如果还没有,则决定再雇佣一个工人(这和开始雇佣工人的步骤没有两样)。

4.如果已经达到雇佣上线,线程池没有办法了,只好拒绝该任务。
拒绝的方式有:
1、抛出异常给任务递送者,告诉他“老子累屁了,老子真的不干了”。 --这太粗暴了。线程池默认就这么干!
2、偷蔫儿地丢弃这个任务。 --这太猥琐了。
3、从任务列表里丢弃一个最近的任务,然后把这个任务放里。--这太势利眼了。
4、还给任务递送者,让他自己干。--这太无耻了。

5.线程池让工人等待任务的策略分两种(本文不考虑生命周期和状态):
死等!当工人数量少于或者等于最低雇佣数量时,它们没啥任务干了,就必须死等。
如果在给定时间内,没有任务来到,线程池开始数人头,如果不多于最低雇佣数量,这个工人还得重新等一个给定时间那么长。

6.否则,线程池把该工人的线程结束,告诉当前等待的工人,你没有任务了。不要再等了。

7.没有拿到任务的工人,被清除出工人集合--该工人正式下岗。
分享到:
评论

相关推荐

    Java线程池与ThreadPoolExecutor.pdf

    线程池通过ThreadPoolExecutor类实现,这是一个高度可配置的工具,能够根据具体需求定制线程的创建、管理和销毁策略。 ThreadPoolExecutor的核心参数包括: 1. corePoolSize:核心线程数,这是线程池在非繁忙状态下...

    java 线程池例子ThreadPoolExecutor

    ThreadPoolExecutor 是 Java 中一个非常重要的线程池实现类,它提供了一个高效、灵活的线程池解决方案。 ThreadPoolExecutor 的基本知识 ------------------------- ThreadPoolExecutor 是 Java 中一个高级的...

    深入理解Java线程池:ThreadPoolExecutor _ Idea Buffer1

    1. RUNNING :能接受新提交的任务,并且也能处理阻塞队列中的任务 2. SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保

    java线程池ThreadPoolExecutor类使用详解.docx

    在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了...

    线程池之ThreadPoolExecutor.docx

    线程池是多线程编程中一种高效管理线程资源的方式,主要由Java的`ThreadPoolExecutor`类实现。线程池的工作机制在于控制线程数量,它会将任务放入队列,然后根据线程池的设定创建并启动线程执行这些任务。如果线程...

    12、线程池ThreadPoolExecutor实战及其原理分析(下)

    线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor...

    java线程池使用后到底要关闭吗

    java线程池使用后到底要关闭吗 java线程池是一种高效的并发编程技术,可以帮助开发者更好地管理线程资源,提高系统的性能和可靠性。然而,在使用java线程池时,一个常见的问题是:使用完线程池后到底要不要关闭?...

    JDK1[1].5中的线程池(ThreadPoolExecutor)使用简介

    JDK1[1].5中的线程池(ThreadPoolExecutor)使用简介

    java线程池封装j

    其中,最常用的是`ThreadPoolExecutor`类,它提供了丰富的参数用于定制线程池的行为。线程池的核心组件包括: - **核心线程数(corePoolSize)**:线程池维护的最小线程数量,即使空闲也会保留。 - **最大线程数...

    java线程池对象ThreadPoolExecutor的深入讲解

    Java线程池是一种高效管理线程资源的工具,它的核心组件是`ThreadPoolExecutor`类,它在Java的`java.util.concurrent`包中。线程池的使用能够显著提高应用程序的性能和响应速度,同时减少系统资源的浪费。下面将详细...

    java线程池实例详细讲解

    Java线程池的实现主要有`ThreadPoolExecutor`类,它提供了丰富的构造参数来定制线程池的行为: - `corePoolSize`:线程池的基本大小,即当线程池创建后和运行过程中,即使没有任务,也会保持这个数量的线程存活。 -...

    Java线程池文档

    线程池在Java中是通过`java.util.concurrent`包下的`ThreadPoolExecutor`类实现的。 线程池的主要作用是限制系统中执行线程的数量,通过预先配置好的线程数量,可以避免过多线程导致的资源浪费和系统拥挤,从而提高...

    Java线程池使用说明

    在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,其中包含了一系列关于线程池的接口和类,极大地丰富了线程池的应用场景和管理方式。 线程池的主要作用是限制系统...

    java线程池threadpool简单使用源码

    `ThreadPoolExecutor`类则提供了更具体的线程池配置和管理选项,如核心线程数、最大线程数、线程空闲时间、工作队列等。 1. **核心线程数**:线程池中始终存在的线程数,即使它们处于空闲状态。当线程池被创建时,...

    自定义实现Java线程池

    对于更复杂的应用场景,建议使用成熟的线程池框架,如`ThreadPoolExecutor`,它可以提供更完善的特性和更好的性能。 通过本次实践,我们不仅了解了线程池的工作原理,还学到了如何根据需求灵活定制线程池的行为,这...

    java线程池的源码分析.zip

    首先,我们要理解Java线程池的核心类`java.util.concurrent.ThreadPoolExecutor`,它是所有自定义线程池的基类。线程池通过维护一个工作线程集合来管理任务的执行,避免了频繁创建和销毁线程的开销,提高了系统的...

    JDK1[1].5中的线程池(ThreadPoolExecutor)使用简介.

    corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的...

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

    在Java中,`java.util.concurrent`包下的`ExecutorService`接口及其实现类如`ThreadPoolExecutor`是线程池的核心组件。 线程池通过任务队列(工作队列)来管理待执行的任务。在"java 线程池实现多并发队列后进先出...

    java线程池实例

    在Java中,`java.util.concurrent`包提供了`ExecutorService`接口和它的实现类,如`ThreadPoolExecutor`,来支持线程池的创建和管理。本实例将深入探讨如何在Java中使用线程池,以及其背后的原理和最佳实践。 首先...

    Java 线程池的原理与实现

    - **Java内置线程池**:Java通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类如`ThreadPoolExecutor`提供了线程池的实现。`ThreadPoolExecutor`允许自定义线程池的核心参数,如核心线程数、最大...

Global site tag (gtag.js) - Google Analytics