欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Java】线程池的那些事儿

程序员文章站 2022-04-30 23:44:44
...

概念

  • 线程池管理器:创建并管理线程池(创建线程池,销毁线程池,添加新任务)
  • 工作线程:指线程池中的线程,在没有任务时处于等待状态,有新任务时被重新调度
  • 任务接口:只有实现该接口,才能被工作线程调度,主要规定了任务的入口,任务执行后的收尾工作,任务的执行状态等
  • 任务队列:提供一种缓冲机制,用于存放没有处理的任务

线程池在JDK中的API

【Java】线程池的那些事儿

public interface ExecutorService extends Executor {

    /**
     * 关闭线程池,之前提交的任务都会执行,但不会接收新的任务
     */
    void shutdown();

    /**
     * 停止所有正在执行的任务,返回等待执行任务的list
     */
    List<Runnable> shutdownNow();

    /**
     * 判断线程池是否关闭
     */
    boolean isShutdown();

    /**
     * 判断线程池中所有任务是否都已执行完
     */
    boolean isTerminated();

    /**
     * 检测ExecutorService是否已关闭
     */
    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 提交一个用于执行的任务,返回一个Future对象,执行结果为result
     */
    <T> Future<T> submit(Runnable task, T result);

    /**
     * 提交一个用于执行的任务,返回一个Future对象,执行结果为null
     */
    Future<?> submit(Runnable task);

    /**
     * 执行给定的任务集合
     */
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
        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;
}

线程池工具类 —— Executors

// 创建一个固定大小,任务队列容量无限制的线程池。核心线程数 = 最大线程数
java.util.concurrent.Executors#newFixedThreadPool(int)
// 创建一个大小无限制的缓冲线程池,任务队列是一个同步队列
// 当任务加到线程池中,如果有空闲线程,则通过空闲线程执行,空闲线程超过60s,会被销毁释放
// 线程数随任务多少变化,适用于执行耗时较小的异步任务
java.util.concurrent.Executors#newCachedThreadPool()
// 单一线程池,只有一个线程执行*任务队列,任务按照加入的顺序依次执行
java.util.concurrent.Executors#newSingleThreadExecutor()
// 能定时执行任务的线程池,核心线程数通过参数决定
java.util.concurrent.Executors#newScheduledThreadPool(int)

线程池执行任务的过程

  1. 判断是否达到核心线程数量:如果没达到,创建新的工作线程
  2. 如果达到了核心线程数量,判断工作队列是否已满:如果没满,将新提交的任务存储在工作队列
  3. 如果工作队列已满,判断是否达到线程池最大数量:如果没达到,创建新的工作线程
  4. 如果达到了线程池最大数量,执行拒绝策略
相关标签: 后端 Java