我在我的项目中使用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的构造方法的参数传递。
无法找到此问题的任何线索。以前有没有人遇到过这个问题?
感谢。
答案 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