4

我的理解是 callable 是在 1.5 中添加的,并且 runnable 接口保持原样以防止世界结束。为什么我不能实例化 a - 为什么队列必须只取可运行?在内部,如果我要提交、invokeAll、invokeAny 可调用对象,这应该没问题吧?另外,会返回一个可调用的列表吗?ThreadPoolExecutor(core, max, tu, unit, new BlockingQueue<Callable>())shutDownNow()

4

3 回答 3

9

您可以提交Callables,但它们在内部被包装为Runnables(实际上FutureTasks是实现Runnable)。shutDownNow()只会回来Runnables,就像罐头上说的那样。

如果您想获取Callables尚未运行的列表,您需要以某种方式自己跟踪它们(例如,保留它们的列表并让它们负责在调用时将自己从列表中删除。 )

于 2013-08-09T18:54:06.303 回答
2

作为更一般的答案,您不能通过更改类型参数来影响 Java 程序的运行时行为。if不能根据类型参数重新路由任何分支。如果您发现自己处于希望从 API 获得不同行为的情况,请不要在选择类型参数时寻找解决方案。

在这种特殊情况下,aRunnable是一种更通用的对象类型:它是 Executor 内部可以提交给线程的工作单元。例如,Runnable可以包含调用 aCallable并将其结果保存在某处的代码。

于 2013-08-09T18:46:57.933 回答
1

由于类型擦除,它不能同时使用BlockingQueue<Callable<T>>BlockingQueue<Runnable>两个重载都将具有相同的原始类型BlockingQueue,因此会发生冲突。

不过,我不知道您会如何处理Callable提交给执行者的 s 列表。你会如何处理他们的结果?它会去哪里?

听起来你想要一个Future<T>. 您可以使用 提交Callable<T>s的集合invokeAll,并且您将返回一个Future<T>s 的集合,一旦它们可用,您就可以从中获取值。

于 2013-08-09T18:53:06.687 回答