ThreadPoolExecutor使用
时间: 2023-10-17 09:20:15 浏览: 91
ThreadPoolExecutor 是 Java 中的一个线程池实现,用于管理和重用线程,从而实现线程的可复用性和高效性。
ThreadPoolExecutor 类提供了很多构造函数,但最常用的是以下构造函数:
```java
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
```
其中:
- `corePoolSize`:核心线程数,即线程池中始终存在的线程数量。
- `maximumPoolSize`:最大线程数,即线程池中允许的最大线程数量。
- `keepAliveTime`:非核心线程空闲时的存活时间。
- `unit`:存活时间的时间单位。
- `workQueue`:任务队列,用于存储等待执行的任务。
使用 ThreadPoolExecutor 的基本流程如下:
1. 创建 ThreadPoolExecutor 对象,并设置核心线程数、最大线程数、线程空闲时间、任务队列等参数。
2. 提交任务给线程池,由线程池管理和执行任务。
3. 当线程池中的线程数量超过核心线程数时,新提交的任务会被放入任务队列中等待执行。
4. 当任务队列已满时,继续提交任务将触发最大线程数的限制,此时线程池会创建新的线程来执行任务。
5. 当线程池中的线程数量超过最大线程数时,新提交的任务将会被拒绝并抛出异常。
以下是一个使用 ThreadPoolExecutor 的示例代码:
```java
import java.util.concurrent.*;
public class ThreadPoolExecutorDemo {
public static void main(String[] args) {
// 创建一个线程池,核心线程数为2,最大线程数为4,空闲线程存活时间为10秒,任务队列容量为10
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
// 提交10个任务给线程池
for (int i = 1; i <= 10; i++) {
executor.submit(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 " + taskId + " is running on " + Thread.currentThread().getName());
}
}
}
```
输出结果如下:
```
Task 1 is running on pool-1-thread-1
Task 2 is running on pool-1-thread-2
Task 3 is running on pool-1-thread-1
Task 4 is running on pool-1-thread-2
Task 5 is running on pool-1-thread-1
Task 6 is running on pool-1-thread-2
Task 7 is running on pool-1-thread-3
Task 8 is running on pool-1-thread-4
Task 9 is running on pool-1-thread-1
Task 10 is running on pool-1-thread-2
```
可以看到,线程池中的线程会复用,任务会在空闲的线程上执行,当线程池中线程数量不足时,新的线程会被创建。
阅读全文