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