线程池拒绝策略中拿到任务参数
时间: 2023-10-21 15:03:53 浏览: 166
Java线程池的拒绝策略实现详解
5星 · 资源好评率100%
在线程池拒绝策略中拿到任务参数,可以使用自定义的 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);
```
这样,在线程池中的线程都忙碌时,新的任务就会被放到阻塞队列中,等待线程池中有空闲线程时再去执行任务,并且在拒绝任务时可以拿到任务的参数。
阅读全文