调用ThreadPoolExecutor.execute但没有真正执行

时间:2015-07-29 11:29:14

标签: java threadpoolexecutor

我在我的项目中使用Java的ThreadPoolExecutor。

构造函数方法如下:

threadBlockingQueue = new ArrayBlockingQueue(100);

threadPoolExecutor = new ThreadPoolExecutor(2, 4, 100, TimeUnit.SECONDS, threadBlockingQueue, new RejectedExecutionHandler() {

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        LOGGER.error("Thread Pool Reject Job");
    }
});

我调用ThreadPoolExecutor.execute(Runnable),但最后还是没有执行某些任务。大多数任务都可以执行,但仍有一些任务在日志中没有任何异常消失。我也没有在RejectedExecutionHandler中找到任何记录,我将其作为ThreadPoolExecutor的构造方法的参数传递。

无法找到此问题的任何线索。以前有没有人遇到过这个问题?

感谢。

1 个答案:

答案 0 :(得分:0)

当队列已满时,将调用RejectedExecutionHandler,您可以实现自己的并将其传递给TheadPoolExecutor构造函数。

下面的一个在空间可用时将Runnable添加到队列中。

以下实现将执行所有任务:

new RejectedExecutionHandler {
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
    try {
        executor.getQueue().put(r); // waiting if necessary for space to become available
    } catch(InterruptedException ex) {
        throw new RejectedExecutionException(ex);
    }
}

不松散任务的另一种方法是使用正确的Policy作为RejectedExecutionHandler:

java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy

将直接在execute方法的调用线程中运行被拒绝的任务。

java.util.concurrent.ThreadPoolExecutor#execute