用java 写一个完整new ThreadPoolExecutor创建一个10线程,队列上限100,队列满了,拒绝插入的现成池
时间: 2024-09-20 08:11:08 浏览: 38
java编写的一个多线程程序,模拟银行排队.zip
在Java中,我们可以使用`ThreadPoolExecutor`来创建一个线程池,当队列满且无空闲线程时,可以设置拒绝策略来处理新的任务。下面是一个完整的示例:
```java
import java.util.concurrent.*;
public class CustomThreadPool {
public static void main(String[] args) {
// 创建一个定长线程池,核心线程数为10,最大线程数也为10
int corePoolSize = 10;
int maximumPoolSize = 100; // 队列最大容量
// 使用BlockingQueue作为工作队列,当队列满时,新提交的任务将被拒绝
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(maximumPoolSize);
// 拒绝策略:当工作队列已满且所有线程都在运行时,新任务会被丢弃并抛出RejectedExecutionException异常
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
// 创建ThreadPoolExecutor实例
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize, // 核心线程数
maximumPoolSize, // 最大线程数
60L, // 线程空闲时间,超过这个时间会终止线程
TimeUnit.SECONDS,
workQueue, // 工作队列
handler // 拒绝策略
);
// 提交任务到线程池
for (int i = 0; i < 150; i++) { // 注意这里大于最大队列容量,测试拒绝策略
Runnable task = () -> {
System.out.println("Thread " + Thread.currentThread().getName() + " is running task " + i);
try {
Thread.sleep(100); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
};
executor.execute(task);
}
// 关闭线程池,清理资源
executor.shutdown();
}
}
```
在这个例子中,我们创建了一个线程池,当提交的任务超出队列容量时,会触发`AbortPolicy`的拒绝策略,即直接抛出异常。
阅读全文