ThreadPoolExecutor源码解析(三)

ThreadPoolExecutor是Java并发编程中用于管理线程池的关键类,它提供了如execute()用于执行任务,shutdown()和shutdownNow()来优雅地关闭线程池,以及调整核心和最大线程数、设置超时策略等方法。此外,还涉及beforeExecute()和afterExecute()回调方法,用于任务执行前后执行自定义逻辑。
摘要由CSDN通过智能技术生成

本篇介绍一些ThreadPoolExecutor类常用方法

方法摘要

Modifier and Type 修饰符和类型

Method and Description 方法和描述

protected void

afterExecute(Runnable r, Throwable t)

完成指定Runnable的执行后调用方法。

void

allowCoreThreadTimeOut(boolean value)

设置策略是否核心线程可能会超时,如果任务没有在活着的时间内到达,则在新任务到达时被替换。

boolean

allowsCoreThreadTimeOut()

如果此池允许核心线程超时并终止,如果没有任务在keepAlive时间内到达,则返回true,如果新任务到达时需要更换。

boolean

awaitTermination(long timeout, TimeUnit unit)

阻止所有任务在关闭请求完成后执行,或发生超时,或当前线程中断,以先到者为准。

protected void

beforeExecute(Thread t, Runnable r)

在给定的线程中执行给定的Runnable之前调用方法。

void

execute(Runnable command)

在将来某个时候执行给定的任务。

protected void

finalize()

当这个执行器不再被引用并且没有线程时,调用 shutdown 。

int

getActiveCount()

返回正在执行任务的线程的大概数量。

long

getCompletedTaskCount()

返回完成执行的任务的大致总数。

int

getCorePoolSize()

返回核心线程数。

long

getKeepAliveTime(TimeUnit unit)

返回线程保持活动时间,这是超过核心池大小的线程在终止之前可能保持空闲的时间量。

int

getLargestPoolSize()

返回在池中同时进行的最大线程数。

int

getMaximumPoolSize()

返回允许的最大线程数。

int

getPoolSize()

返回池中当前的线程数。

BlockingQueue<Runnable>

getQueue()

返回此执行程序使用的任务队列。

RejectedExecutionHandler

getRejectedExecutionHandler()

返回不可执行任务的当前处理程序。

long

getTaskCount()

返回计划执行的任务的大概总数。

ThreadFactory

getThreadFactory()

返回用于创建新线程的线程工厂。

boolean

isShutdown()

如果此执行者已关闭,则返回 true 。

boolean

isTerminated()

如果所有任务在关闭后完成,则返回 true 。

boolean

isTerminating()

如果此执行者在 shutdown()或 shutdownNow()之后 终止 ,但尚未完全终止,则返回true。

int

prestartAllCoreThreads()

启动所有核心线程,导致他们等待工作。

boolean

prestartCoreThread()

启动核心线程,使其无法等待工作。

void

purge()

尝试从工作队列中删除已取消的所有Future任务。

boolean

remove(Runnable task)

如果此任务存在,则从执行程序的内部队列中删除此任务,从而导致该任务尚未运行。

void

setCorePoolSize(int corePoolSize)

设置核心线程数。

void

setKeepAliveTime(long time, TimeUnit unit)

设置线程在终止之前可能保持空闲的时间限制。

void

setMaximumPoolSize(int maximumPoolSize)

设置允许的最大线程数。

void

setRejectedExecutionHandler(RejectedExecutionHandler handler)

为不可执行的任务设置一个新的处理程序。

void

setThreadFactory(ThreadFactory threadFactory)

设置用于创建新线程的线程工厂。

void

shutdown()

启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。

List<Runnable>

shutdownNow()

尝试停止所有主动执行的任务,停止等待任务的处理,并返回正在等待执行的任务列表。

protected void

terminated()

执行程序已终止时调用方法。

String

toString()

返回标识此池的字符串及其状态,包括运行状态和估计的工作人员和任务计数的指示。

方法详细信息

execute

public void execute(Runnable command)

在将来某个时候执行给定的任务。 任务可以在新线程或现有的合并的线程中执行。 如果任务无法提交执行,由于此执行程序已关闭或已达到其容量,该任务将由当前的RejectedExecutionHandler处理。

参数

command - 要执行的任务

异常

RejectedExecutionException - 由RejectedExecutionHandler自行 RejectedExecutionHandler ,如果任务不能被接受执行

NullPointerException - 如果 command为空

shutdown

public void shutdown()

启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有额外的作用。

此方法不等待以前提交的任务完成执行。 使用awaitTermination做到这一点。

异常

SecurityException - 如果安全管理器存在并关闭,则ExecutorService可能会操纵调用者不允许修改的线程,因为它不保留

RuntimePermission ("modifyThread")或安全管理器的checkAccess方法拒绝访问。

shutdownNow

public List<Runnable> shutdownNow()

尝试停止所有主动执行的任务,停止等待任务的处理,并返回正在等待执行的任务列表。 从此方法返回时,这些任务将从任务队列中排除(删除)。

此方法不等待主动执行的任务终止。 使用awaitTermination做到这一点。

除了努力尝试停止处理积极执行任务之外,没有任何保证。 此实现通过取消任务Thread.interrupt() ,让未能响应中断任何任务可能永远不会终止。

结果

从未开始执行的任务列表

异常

SecurityException - 如果安全管理器存在并关闭,则ExecutorService可能会操纵调用者不允许修改的线程,因为它不保留RuntimePermission ("modifyThread")或安全管理器的checkAccess方法拒绝访问。

isShutdown

public boolean isShutdown()

说明从界面: ExecutorService复制

如果执行者已关闭,则返回 true 。

结果

true如果这个执行者已被关闭

isTerminating

public boolean isTerminating()

如果此执行者在shutdown()或shutdownNow()之后终止 ,但尚未完全终止,则返回true。 此方法可能对调试有用。 返回true报告了关机后的足够的时间可能表明提交的任务已经忽略或抑制中断,导致执行者不能正常终止。

结果

true如果终止但尚未终止

isTerminated

public boolean isTerminated()

说明从界面: ExecutorService复制

如果所有任务在关闭后完成,则返回true 。 请注意, isTerminated从不是true ,除非shutdown或shutdownNow被称为第一个。

结果

true如果所有任务已完成关闭

awaitTermination

public boolean awaitTermination(long timeout,TimeUnit unit)throws InterruptedException

说明从界面: ExecutorService复制

阻止所有任务在关闭请求完成后执行,或发生超时,或当前线程中断,以先到者为准。

参数

timeout - 等待的最长时间

unit - 超时参数的时间单位

结果

true如果这个执行者终止了 false如果在终止之前超时了

异常

InterruptedException - 如果中断等待

finalize

protected void finalize()

当这个执行器不再被引用并且没有线程时,调用 shutdown 。

重写:

finalize在类别 Object

另请参见:

WeakReference , PhantomReference

setThreadFactory

public void setThreadFactory(ThreadFactory threadFactory)

设置用于创建新线程的线程工厂。

参数

threadFactory - 新线工厂

异常

NullPointerException - 如果threadFactory为null

另请参见:

getThreadFactory()

getThreadFactory

public ThreadFactory getThreadFactory()

返回用于创建新线程的线程工厂。

结果

当前线程工厂

另请参见:

setThreadFactory(ThreadFactory)

setRejectedExecutionHandler

public void setRejectedExecutionHandler(RejectedExecutionHandler handler)

为不可执行的任务设置一个新的处理程序。

参数

handler - 新的处理程序

异常

NullPointerException - 如果处理程序为空

另请参见:

getRejectedExecutionHandler()

getRejectedExecutionHandler

public RejectedExecutionHandler getRejectedExecutionHandler()

返回不可执行任务的当前处理程序。

结果

当前处理程序

另请参见:

setRejectedExecutionHandler(RejectedExecutionHandler)

setCorePoolSize

public void setCorePoolSize(int corePoolSize)

设置核心线程数。 这将覆盖在构造函数中设置的任何值。 如果新值小于当前值,则过多的现有线程在下一个空闲时将被终止。 如果更大,则如果需要,新线程将被启动以执行任何排队的任务。

参数

corePoolSize - 新的核心尺寸

异常

IllegalArgumentException - 如果 corePoolSize < 0

另请参见:

getCorePoolSize()

getCorePoolSize

public int getCorePoolSize()

返回核心线程数。

结果

核心线程数

另请参见:

setCorePoolSize(int)

prestartCoreThread

public boolean prestartCoreThread()

启动核心线程,使其无法等待工作。 这将覆盖仅在执行新任务时启动核心线程的默认策略。 如果所有核心线程已经启动,此方法将返回false 。

结果

true如果线程启动

prestartAllCoreThreads

public int prestartAllCoreThreads()

启动所有核心线程,导致他们等待工作。 这将覆盖仅在执行新任务时启动核心线程的默认策略。

结果

线程数已启动

allowsCoreThreadTimeOut

public boolean allowsCoreThreadTimeOut()

如果此池允许核心线程超时并终止,如果没有任务在keepAlive时间内到达,则返回true,如果新任务到达时需要更换。 当为true时,应用于非核心线程的同样的保持活动策略也适用于核心线程。 当为false(默认值)时,由于缺少传入任务,核心线程不会终止。

结果

true如果核心线程被允许超时,否则 false

allowCoreThreadTimeOut

public void allowCoreThreadTimeOut(boolean value)

设置策略是否核心线程可能会超时,如果任务没有在活着的时间内到达,则在新任务到达时被替换。 当虚假时,核心线程由于缺少传入任务而永远不会被终止。 当为true时,应用于非核心线程的同样的保持活动策略也适用于核心线程。 为避免连续更换线,设置true时,保持活动时间必须大于零。 这个方法一般应该在池被主动使用之前调用。

参数

value - true如果要超时,否则 false

异常

IllegalArgumentException - 如果值为 true ,并且当前保持活动时间不大于零

setMaximumPoolSize

public void setMaximumPoolSize(int maximumPoolSize)

设置允许的最大线程数。 这将覆盖在构造函数中设置的任何值。 如果新值小于当前值,则过多的现有线程在下一个空闲时将被终止。

参数

maximumPoolSize - 新的最大值

异常

IllegalArgumentException - 如果新的最大值小于或等于零,或小于 core pool size

另请参见:

getMaximumPoolSize()

getMaximumPoolSize

public int getMaximumPoolSize()

返回允许的最大线程数。

结果

允许的最大线程数

另请参见:

setMaximumPoolSize(int)

setKeepAliveTime

public void setKeepAliveTime(long time,TimeUnit unit)

设置线程在终止之前可能保持空闲的时间限制。 如果存在超过当前在池中的线程核心数量,则在等待这段时间而不处理任务之后,多余的线程将被终止。 这将覆盖在构造函数中设置的任何值。

参数

time - 等待的时间 时间值为零将导致多余的线程在执行任务后立即终止。

unit - time参数的时间单位

异常

IllegalArgumentException - 如果 time小于零或 time为零, allowsCoreThreadTimeOut

另请参见:

getKeepAliveTime(TimeUnit)

getKeepAliveTime

public long getKeepAliveTime(TimeUnit unit)

返回线程保持活动时间,这是超过核心池大小的线程在终止之前可能保持空闲的时间量。

参数

unit - 结果所需的时间单位

结果

时间限制

另请参见:

setKeepAliveTime(long, TimeUnit)

getQueue

public BlockingQueue<Runnable> getQueue()

返回此执行程序使用的任务队列。 访问任务队列主要用于调试和监视。 此队列可能正在使用中。 检索任务队列不会阻止排队的任务执行。

结果

任务队列

remove

public boolean remove(Runnable task)

如果此任务存在,则从执行程序的内部队列中删除此任务,从而导致该任务尚未运行。

该方法作为取消方案的一部分可能是有用的。 在放入内部队列之前,可能无法删除已转换为其他表单的任务。 例如,使用submit输入的任务可能会转换为维护Future状态的表单。 然而,在这种情况下,可以使用方法purge()去除已被取消的那些期货。

参数

task - 要删除的任务

结果

true如果任务被删除

purge

public void purge()

尝试从工作队列中删除已取消的所有Future任务。 此方法可用作存储回收操作,对功能没有其他影响。 取消的任务永远不会执行,但可能会累积在工作队列中,直到工作线程可以主动删除它们。 现在调用此方法会尝试删除它。 但是,该方法可能无法在其他线程的干扰存在的情况下删除任务。

getPoolSize

public int getPoolSize()

返回池中当前的线程数。

结果

线程数

getActiveCount

public int getActiveCount()

返回正在执行任务的线程的大概数量。

结果

线程数

getLargestPoolSize

public int getLargestPoolSize()

返回在池中同时进行的最大线程数。

结果

线程数

getTaskCount

public long getTaskCount()

返回计划执行的任务的大概总数。 因为任务和线程的状态在计算过程中可能会动态地改变,所以返回的值只是一个近似值。

结果

任务数量

getCompletedTaskCount

public long getCompletedTaskCount()

返回完成执行的任务的大致总数。 因为任务和线程的状态可能在计算过程中动态地改变,所以返回的值只是一个近似值,但是在连续的调用中并不会减少。

结果

任务数量

toString

public String toString()

返回标识此池的字符串及其状态,包括运行状态和估计的工作人员和任务计数的指示。

重写:

toString在类别 Object

结果

一个标识这个池的字符串,以及它的状态

beforeExecute

protected void beforeExecute(Thread t, Runnable r)

在给定的线程中执行给定的Runnable之前调用方法。 该方法由执行任务r的线程t调用,并可用于重新初始化ThreadLocals或执行日志记录。

此实现不执行任何操作,但可以在子类中进行自定义。 注意:为了正确嵌套多个重复数据,子类super.beforeExecute在此方法结束时调用super.beforeExecute 。

参数

t - 将运行任务 r的线程

r - 将执行的任务

afterExecute

protected void afterExecute(Runnable r, Throwable t)

完成指定Runnable的执行后调用方法。 该方法由执行该任务的线程调用。 如果非空,则Throwable是RuntimeException或Error ,导致执行突然终止。

此实现不执行任何操作,但可以在子类中进行自定义。 注意:为了正确嵌套多个覆盖,子类应该在此方法开始时调用super.afterExecute 。

注意:当操作被明确地包含在任务(如FutureTask )中或通过诸如submit之类的方法被submit时,这些任务对象捕获和维护计算异常,因此它们不会引起突然终止,并且内部异常不会传递给该方法。 如果您希望在此方法中捕获两种故障,您可以进一步探测这种情况,如在此示例子类中,如果任务已中止,则会打印直接原因或底层异常:

class ExtendedExecutor extends ThreadPoolExecutor { 
    // ...
    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
        if (t == null && r instanceof Future<?>) {
            try {
                Object result = ((Future<?>)r).get();
            } catch (CancellationException ce) {
                t = ce;
            } catch (ExecutionException ee) {
                t = ee.getCause();
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt(); // ignore/reset
            }
        }
        if (t != null)
            System.out.println(t);
    }
}

参数

r - 已完成的runnable

t - 导致终止的异常,如果执行正常完成,则为null

terminated

protected void terminated()

执行程序已终止时调用方法。 默认实现什么都不做。 注意:为了正确嵌套多个覆盖,子类应super.terminated在此方法中调用super.terminated 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值