ThreadPoolExecutor的构造函数中指定了拒绝策略,及当任务数量超过了系统实际承载能力时该如何处理。
JDK内置了四种拒绝策略:
1、AbortPolicy策略
该策略直接抛出异常,阻止系统工作
2、CallerRunsPolicy策略
只要线程池未关闭,该策略直接在调用者线程中运行当前被丢弃的任务。显然这样不会真的丢弃任务,但是,调用者线程性能可能急剧下降。
3、DiscardOledestPolicy策略
丢弃最老的一个请求任务,也就是丢弃一个即将被执行的任务,并尝试再次提交当前任务。
4、DiscardPolicy策略
默默的丢弃无法处理的任务,不予任何处理。
扩展RejectedExecutioHandler接口,自定义拒绝策略
先看下RejectedExecutionHandler接口吧:
public interfaceRejectedExecutionHandler{
voidrejectedExecution(Runnable r,ThreadPoolExecutor executor);
}
再举个例子吧:
public classTestRejectHandler {
class MyTask implements Runnable{
@Override
public void run()
{
System.out.println("Thread ID:"+Thread.currentThread().getId());
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public void test(){
ThreadPoolExecutor executor=
newThreadPoolExecutor(5, 5,
0L, TimeUnit.MILLISECONDS,
newLinkedBlockingQueue(10),
Executors.defaultThreadFactory(),
newRejectedExecutionHandler()
{
@Override
public voidrejectedExecution(Runnable r,
ThreadPoolExecutor executor)
{
System.out.println(r.toString()+"
被抛弃了");
}
});
MyTask task=
newMyTask();
for(int i=0;i<20;i++){
executor.submit(task);
}
executor.shutdown();
}
}
运行结果:
http://s15/mw690/0024DMqMgy70SxML6eG8e&690
运行test()方法,可以看到有5个任务被拒绝执行,且采用了自定义的拒绝策略。
加载中,请稍候......