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