为什么我不能用 BlockingQueue 实例化 ThreadPoolExecutor<Callable>;为什么只有 BlockingQueue<Runnable>?



我的理解是,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>集合,一旦它们可用,您就可以从中获取值。

相关内容

  • 没有找到相关文章

最新更新