📜  Java中的线程池(1)

📅  最后修改于: 2023-12-03 15:32:02.037000             🧑  作者: Mango

Java中的线程池

简介

线程池是一种重要的基础框架,主要用于管理多线程和线程调度。线程池可以缓存线程,减少创建线程和销毁线程的开销,从而提升程序的性能。Java提供了内置的线程池类ThreadPoolExecutor。

使用方法
创建线程池

线程池可以通过静态工厂方法Executors创建。Executors提供了几种不同的线程池类型,如下:

  • fixedThreadPool: 固定大小的线程池。
  • singleThreadExecutor: 只有一个工作线程的线程池。
  • cachedThreadPool: 根据需要创建新线程的线程池。
ExecutorService pool = Executors.newFixedThreadPool(10);
提交任务

可以通过submit方法向线程池提交任务。

Future<?> future = pool.submit(new Runnable(){
    @Override
    public void run() {
        // do something...
    }
});

submit方法将Runnable或Callable对象提交给线程池执行。返回一个Future对象,可以用于检查任务的执行结果。

关闭线程池

在程序退出前,应该关闭线程池,释放线程资源。

pool.shutdown();
线程池参数

ThreadPoolExecutor类有以下构造函数:

public ThreadPoolExecutor(
    int corePoolSize,      // 核心线程池大小
    int maximumPoolSize,   // 最大线程池大小
    long keepAliveTime,    // 空闲线程存活时间
    TimeUnit unit,         // 时间单位
    BlockingQueue<Runnable> workQueue,     // 工作队列
    ThreadFactory threadFactory,           // 线程工厂
    RejectedExecutionHandler handler        // 拒绝任务处理器
)

其中参数的含义如下:

  • corePoolSize: 核心线程池大小。当新任务被提交时,线程池创建新线程,直到线程池中线程数达到corePoolSize。
  • maximumPoolSize: 最大线程池大小。当线程池中线程数达到corePoolSize后,新的任务将被放入工作队列中。当工作队列满了,即工作队列中的任务数达到了最大线程池大小,线程池会创建新线程去处理任务,直到线程数达到maximumPoolSize。如果maximumPoolSize设置为无限大,则线程池大小仅受系统资源的限制。
  • keepAliveTime: 空闲线程存活时间。如果线程池中线程数大于corePoolSize,且线程空闲时间超过了keepAliveTime,那么该线程就会被销毁,直到线程数等于corePoolSize。
  • unit: 时间单位。
  • workQueue: 工作队列。用于存放等待执行的任务。
  • threadFactory: 线程工厂。用于创建新线程。
  • handler: 拒绝任务处理器。当工作队列和线程池都满时,新的任务将被拒绝,该拒绝处理器将处理被拒绝的任务。
线程池的生命周期

线程池有以下状态:

  • RUNNING: 线程池处于正常运行状态。
  • SHUTDOWN: 线程池不再接受新任务,但会处理尚未完成的任务。
  • STOP: 线程池不再接受新任务,也不会处理尚未完成的任务,并中断正在执行的线程。
  • TIDYING: 所有任务都已终止,workerCount为0,线程池将转换为TIDYING状态。该状态进入terminated()方法,完成线程池的终止操作。
  • TERMINATED: terminated()方法已完成执行。
总结

Java中的线程池是一种重要的基础框架。线程池可以缓存线程,减少创建和销毁的开销。Java提供的ThreadPoolExecutor类可以用于创建线程池对象,submit方法用于向线程池提交任务,shutdown方法关闭线程池,参数可以对线程池进行配置。线程池有多个状态,需要注意线程池的生命周期。