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,以提高系统的性能和稳定性。