使用以BlockingQueue <runnable>作为参数的构造函数创建的ThreadPoolExecutor如何使Callables排队?

时间:2019-03-09 23:48:06

标签: java threadpoolexecutor callable blockingqueue

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的类型参数指定为QueueRunnable仍会如何处理?
该任务如何排队?

1 个答案:

答案 0 :(得分:1)

这是因为它在排队或执行之前将Callable任务包装为RunnableFuture

RunnableFuture实现了Runnable接口(除了Future之外)。

因此所有可调用对象都可以排队并执行,而不会出现任何问题。

请查看AbstractExecutorService源以获取更多信息。