线程池的参数 和拒绝策略
时间: 2023-06-12 12:04:57 浏览: 121
线程池的参数包括:
1. 核心线程数(corePoolSize):线程池中的基本线程数,即在没有任务需要执行时线程池的大小。
2. 最大线程数(maximumPoolSize):线程池中允许存在的最大线程数。
3. 非核心线程空闲时间(keepAliveTime):当线程池中的线程数量大于 corePoolSize 时,如果这些线程在执行完任务后处于空闲状态的时间超过了 keepAliveTime,则它们将被终止。
4. 队列(workQueue):用于存放等待执行任务的阻塞队列。常用的队列有 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue 等。
5. 线程工厂(threadFactory):用于创建新线程的工厂类。
拒绝策略指的是当线程池中的任务队列已满且线程池中的线程数达到最大线程数时,新提交的任务会被拒绝执行的处理策略。常用的拒绝策略有:
1. AbortPolicy(默认):直接抛出一个 RejectedExecutionException 异常,阻止系统正常工作。
2. CallerRunsPolicy:由提交任务的线程来执行这个任务。这样可以减缓提交任务的速度。
3. DiscardOldestPolicy:丢弃最早的任务,然后提交新的任务。
4. DiscardPolicy:直接丢弃提交的任务。
相关问题
java线程池的拒绝策略
Java线程池提供了四种拒绝策略。默认的拒绝策略是拒绝任务并抛出异常,可以通过设置`RejectedExecutionHandler`参数来实现该策略。例如,可以使用`ThreadPoolExecutor.AbortPolicy()`来设置默认的拒绝策略。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [Java 线程池四种拒绝策略](https://blog.csdn.net/qq_42700121/article/details/124442422)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *3* [java线程池拒绝策略详解](https://blog.csdn.net/guangyingposuo/article/details/106253140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
线程池拒绝策略中拿到任务参数
在线程池拒绝策略中拿到任务参数,可以使用自定义的 RejectedExecutionHandler。在自定义的 RejectedExecutionHandler 的 rejectedExecution 方法中,可以将任务参数封装到一个自定义的对象中,然后将这个对象放入一个阻塞队列中,等待线程池中有空闲线程时再去执行这个任务。
具体实现可以参考下面的代码示例:
```java
public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
private BlockingQueue<Runnable> queue;
public CustomRejectedExecutionHandler(BlockingQueue<Runnable> queue) {
this.queue = queue;
}
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
if (r instanceof CustomTask) {
CustomTask task = (CustomTask) r;
queue.offer(task);
}
}
}
public class CustomTask implements Runnable {
private Object param;
public CustomTask(Object param) {
this.param = param;
}
@Override
public void run() {
// 执行任务
}
}
```
在使用线程池时,可以将自定义的 RejectedExecutionHandler 和阻塞队列传入 ThreadPoolExecutor 的构造方法中:
```java
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(100);
CustomRejectedExecutionHandler handler = new CustomRejectedExecutionHandler(queue);
ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 20, 60, TimeUnit.SECONDS, queue, handler);
```
这样,在线程池中的线程都忙碌时,新的任务就会被放到阻塞队列中,等待线程池中有空闲线程时再去执行任务,并且在拒绝任务时可以拿到任务的参数。
阅读全文