我的理解是,callable 是在 1.5 中添加的,可运行的接口保持原样以防止世界结束。 为什么我不能实例化ThreadPoolExecutor
(core, max, tu, unit, new BlockingQueue<Callable>())
- 为什么队列必须只运行? 在内部,如果我提交,调用All,调用任何可调用对象,这应该没问题吧? 另外,shutDownNow()
会返回可调用对象列表吗?
提交Callables
,但它们在内部包装为Runnables
(实际上是FutureTasks
,实现Runnable
(。 shutDownNow()
只会返回Runnables
,就像锡上所说的那样。
如果你想获取尚未运行的Callables
列表,你需要以某种方式自己跟踪它们(例如,保留它们的列表,并让它们负责在被调用时将自己从列表中删除。
作为更一般的答案,您不能通过更改类型参数来影响 Java 程序的运行时行为。不能根据类型参数重新路由if
分支。如果您发现自己希望从 API 获得不同的行为,请不要在选择类型参数时寻找解决方案。
在这种特殊情况下,Runnable
是一种更通用的对象类型:它是执行器内部可以提交给线程的工作单元。例如,Runnable
可以包含调用Callable
并将其结果保存在某处的代码。
由于类型擦除,它不能同时接受BlockingQueue<Callable<T>>
和BlockingQueue<Runnable>
;两个重载将具有相同的原始类型BlockingQueue
,因此会发生冲突。
不过,我不知道你会如何处理提交给遗嘱执行人的Callable
清单。你会如何处理他们的结果?它会去哪里?
听起来你想要一个Future<T>
.您可以使用 invokeAll
提交Callable<T>
的集合,并且您将获得一个Future<T>
集合,一旦它们可用,您就可以从中获取值。