ThreadPoolExecutor
的构造函数的BlockingQueue
的类型参数为Runnable
。
假设我有一个这样声明的ThreadPoolExecutor
ThreadPoolExecutor customThreadPool = new ThreadPoolExecutor(numberOfAvailableProcessors,
numberOfAvailableProcessors, 2L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(),
Executors.defaultThreadFactory(),
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor threadPoolExecutor) {
// Do something here to handle it
}
});
我的问题是,何时执行类似的操作:
customThreadPool.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return Math.toIntExact(Thread.currentThread().getId());
}
})
即使我将ThreadPool
的类型参数指定为Queue
,Runnable
仍会如何处理?
该任务如何排队?
答案 0 :(得分:1)
这是因为它在排队或执行之前将Callable
任务包装为RunnableFuture
。
此RunnableFuture
实现了Runnable
接口(除了Future
之外)。
因此所有可调用对象都可以排队并执行,而不会出现任何问题。
请查看AbstractExecutorService
源以获取更多信息。