Java 创建线程池 ThreadPoolExecutor

在Java应用程序中,线程池是一种管理和复用线程的机制,可以有效地控制并发任务的执行。线程池通过重用线程来减少线程创建和销毁的开销,提高系统的性能并减少资源的消耗。Java中提供了Executors类来创建不同类型的线程池,其中ThreadPoolExecutor是最常用的一个类。

ThreadPoolExecutor 类

ThreadPoolExecutor是Java中用于创建线程池的一个类,它提供了丰富的配置选项来创建不同类型的线程池。ThreadPoolExecutor的构造函数如下:

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

参数说明:

  • corePoolSize:核心线程数,线程池中始终保持的线程数量,即使它们是空闲的。
  • maximumPoolSize:最大线程数,线程池中允许的最大线程数量。
  • keepAliveTime:空闲线程的存活时间。
  • unit:keepAliveTime的时间单位。
  • workQueue:任务队列,用于存放等待执行的任务。
  • threadFactory:线程工厂,用于创建新线程。
  • handler:拒绝策略,当任务队列和线程池都满时的处理方式。

示例代码

下面是一个使用ThreadPoolExecutor创建线程池的示例代码:

import java.util.concurrent.*;

public class ThreadPoolExample {

    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                2, 4, 30, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(2),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        for (int i = 0; i < 10; i++) {
            executor.execute(new Task(i));
        }

        executor.shutdown();
    }

    static class Task implements Runnable {
        private int taskId;

        public Task(int taskId) {
            this.taskId = taskId;
        }

        @Override
        public void run() {
            System.out.println("Task ID : " + taskId + " executed by " + Thread.currentThread().getName());
        }
    }
}

类图

下面是ThreadPoolExecutor的类图:

classDiagram
    ThreadPoolExecutor <|-- ThreadPoolExample
    ThreadPoolExecutor : +ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
    ThreadPoolExample : +main(String[] args)
    ThreadPoolExample : -static class Task
    Task : +run()

在上面的代码中,首先创建了一个ThreadPoolExecutor对象executor,设置核心线程数为2,最大线程数为4,空闲线程存活时间为30秒,任务队列为ArrayBlockingQueue,线程工厂为默认的Executors.defaultThreadFactory(),拒绝策略为ThreadPoolExecutor.AbortPolicy()。

然后往线程池中提交了10个任务,每个任务都是一个Task对象,Task实现了Runnable接口,在run方法中输出任务的ID和执行线程的名称。

最后调用executor.shutdown()方法关闭线程池。

结语

通过ThreadPoolExecutor可以方便地创建线程池,并灵活地配置线程池的各项参数,使得线程的管理更加简单和高效。在实际开发中,根据不同的业务场景和需求,可以根据具体的情况来配置ThreadPoolExecutor,以提高系统的性能和稳定性。