JAVA ThreadPoolExecutor 工作队列与 Callable

JAVA ThreadPoolExecutor workqueue with Callable

Java ExecutorService.newFixedThreadPool() 内部使用 LinkedBlockingQueue<Runnable>() 如下:

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

我想知道当我用 callable 调用 ExecutorService.submit(Callable<?>) 时,它是如何被推入 workQueue 的。根据文档,只有 Runnable 被推送到 workQueue,然后当所有线程都忙时 Callable 会发生什么。这些保存在哪里以供以后处理。

根据文档

workQueue - 用于在任务执行前保存任务的队列。此队列将 仅保存由 execute 方法提交的 Runnable 任务。

Callable被封装为一个FutureTask,它同时实现了Runnable和Future。因此,FutureTask 也可以被执行或推送到队列中。 FutureTask 持有 Callable 对象。当 FutureTask 为 运行 时,将调用 Callable 对象并设置 future-related 属性。 其实runnable在提交的时候,是先打包成Callable,再打包成FutureTask。

我相信可调用对象在排队时被包装在可运行对象中。当所有工作人员都忙时,可调用对象肯定与可运行对象一样排队。