使用场景
测试
10个生产者线程,提交1000w个任务
4个消费者线程
现有线程池的缺点
submit(),提交任务的时间和执行任务的时间没有分离
invokeAll() + AbortPolicy策略,如果有一个任务提交失败,则整体失败
invokeAll() + DiscardPolicy策略,如果有一个任务提交失败,则invokeAll需要等到超时时间。因为被抛弃的任务根本没有被执行
static class MyPolicy implements RejectedExecutionHandler {
private int submitTimeoutms;
static RejectedExecutionException exp = new RejectedExecutionException();
public MyPolicy(int submitTimeoutms) {
this.submitTimeoutms = submitTimeoutms;
}
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
try {
// queue 指线程池中的任务队列
boolean res = queue.offer(r, submitTimeoutms, TimeUnit.MILLISECONDS);
if(!res){
((FutureTask) r).cancel(true);
throw exp;
}
} catch (InterruptedException e1) {
throw exp;
}
}
}