使用自定义RejectedExecutionHandler

时间:2014-12-29 16:24:47

标签: java java.util.concurrent threadpoolexecutor

使用java.util.concurrent.ThreadPoolExecutor时,我想尝试再次执行被拒绝的任务。 真的有可能吗?我听说过RejectedExecutionHandler界面。有许多可用的(已知的)接口实例(RejectedExecutionHandler),如ThreadPoolExecutor.AbortPolicy,ThreadPoolExecutor.CallerRunsPolicy,ThreadPoolExecutor.DiscardOldestPolicy,ThreadPoolExecutor.DiscardPolicy等,但问题是它们不允许重试执行。

2 个答案:

答案 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());
    }
}

}

您可以在http://examples.javacodegeeks.com/core-java/util/concurrent/rejectedexecutionhandler/java-util-concurrent-rejectedexecutionhandler-example/

找到有关此内容的更多详情