使用java.util.concurrent.ThreadPoolExecutor
时,我想尝试再次执行被拒绝的任务。
真的有可能吗?我听说过RejectedExecutionHandler
界面。有许多可用的(已知的)接口实例(RejectedExecutionHandler),如ThreadPoolExecutor.AbortPolicy,ThreadPoolExecutor.CallerRunsPolicy,ThreadPoolExecutor.DiscardOldestPolicy,ThreadPoolExecutor.DiscardPolicy等,但问题是它们不允许重试执行。
答案 0 :(得分:3)
下面是一个重试启用的RejectedExecutionHandler,它不需要 额外的ThreadPoolExecutor。它更实用:当任务被拒绝时,被拒绝的任务将以阻塞模式放入ThreadPoolExecutor的workerQueue中,这使得任务提交者在ThreadPoolExecutor可以处理更多任务之前等待一段时间。
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
if (!executor.isShutdown()) {
try {
executor.getQueue().put(r);
} catch (InterruptedException e) {
;
}
}
}
}
答案 1 :(得分:1)
是的,可以重试执行被拒绝的任务。 重试执行的最佳方法是使用备用执行程序。 您可以像使用其他接口一样声明自定义RejectedExecutionHandler类。 以下是一些代码示例:
public class MyRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable worker, ThreadPoolExecutor executor) {
// TODO Auto-generated method stub
System.out.println(worker.toString()+" is Rejected");
System.out.println("Retrying to Execute");
try{
//Re-executing with alternateExecutor
MainClass.alternateExecutor.execute(worker);
System.out.println(worker.toString()+" Execution Started");
}
catch(Exception e)
{
System.out.println("Failure to Re-exicute "+e.getMessage());
}
}
}
找到有关此内容的更多详情