Java中的线程池ThreadPoolExecutor

本文详细介绍了Java中的线程池ThreadPoolExecutor,包括其内部属性、内部类Worker的实现、执行逻辑以及如何通过execute方法处理任务。ThreadPoolExecutor通过线程池管理线程,减少创建线程的开销,便于维护线程信息,避免资源耗尽。文章重点讨论了线程池的状态、核心线程数、最大线程数、任务队列和拒绝策略等关键概念。
摘要由CSDN通过智能技术生成

Java中创建线程的方法有四种,分别为继承Thread类,实现Runnable接口,实现Callable接口和通过线程池。在实际开发中,我们最常用的就是线程池的方法,因为利用线程池我们可以重复利用线程,减少每次创建线程所带来的额外开销;同时使用线程池也方便我们维护管理线程信息;此外,线程池的存在也可以帮助我们避免出现因为代码bug导致的无限创建线程导致系统资源耗尽等问题。

Java中通过使用ThreadPoolExecutor来创建管理线程池,而Spring框架中使用ThreadPoolTaskExecutor管理线程池,这是两个不同的组件,但spring中的ThreadPoolTaskExecutor的核心处理逻辑还是Java中的ThreadPoolExecutor,只是对其进行封装使得其可以成为Bean,交由Spring Context进行管理。

接下来,让我们来了解一下Java中的线程池ThreadPoolExecutor。

1.ThreadPoolExecutor简介

ThreadPoolExecutor类继承AbstractExecutorService类,实现ExecutorService,ExecutorService

接口,下面让我们先看一下这两个接口都定义了什么方法:

public interface Executor {

    /**
     * Executes the given command at some time in the future.  The command
     * may execute in a new thread, in a pooled thread, or in the calling
     * thread, at the discretion of the {@code Executor} implementation.
     *
     * @param command the runnable task
     * @throws RejectedExecutionException if this task cannot be
     * accepted for execution
     * @throws NullPointerException if command is null
     */
    void execute(Runnable command);
}
public interface ExecutorService extends Executor {

    
    void shutdown();

    List<Runnable> shutdownNow();

    
    boolean isShutdown();

    
    boolean isTerminated();

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

    
    <T> Future<T> submit(Callable<T> task);

   
    <T> Future<T> submit(Runnable task, T result);

    Future<?> submit(Runnable task);

    
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
        throws InterruptedException;

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
                                  long timeout, TimeUnit unit)
        throws InterruptedException;

   
    <T> T invokeAny(Collection<? extends Callable<T>> tasks)
        throws InterruptedException, ExecutionException;

    
    <T> T invokeAny(Collection<? extends Callable<T>> tasks,
                    long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

可以看出,Executor接口只定义了一个提交线程的方法,而ExecutorSrevice方法则基础Executor并扩展了它的功能,ExecutorSrevice中的方法看名字大多数也可以看出来,在此我们不做赘述,而ExecutorSrevice中的方法,AbstractExecutorService类都进行了默认的实现,下面我们来看一下AbstractExecutorService这个类中部分方法的实现:

public abstract class AbstractExecutorService implements ExecutorService {

   
    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new FutureTask<T>(runnable, value);
    }

    
    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
        return new FutureTask<T>(callable);
    }

    
    public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

    
    public <T> Future<T> submit(Runnable task, T result) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task, result);
        execute(ftask);
        return ftask;
    }

    
    public <T> Future<T> submit(Callable<T> task) {
        if
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值