用于存储java.util.concurrent.Future实例的容器
我代表一个特定的作业将用于存储java.util.concurrent.Future实例的容器,java,Java,我代表一个特定的作业将Callables提交给ExecutorService(我们可以将作业视为在executor服务上运行的事物的子集) 当然,在提交可调用的时,我会得到一个未来 我需要能够中断代表特定作业提交的未来s。为了实现这一点,我尝试使用嵌入到我的Job类中的java.utils.TreeSet。但是,我担心的是每个未来的差异性:它们会在树集中占据独特的位置吗?如果没有,那么是否有更好的容器可供使用 一种解决方案是,如果一个容器不能胜任,那么它将扩展ExecutorService,并在
Callable
s提交给ExecutorService
(我们可以将作业视为在executor服务上运行的事物的子集)
当然,在提交可调用的
时,我会得到一个未来
我需要能够中断代表特定作业提交的未来s。为了实现这一点,我尝试使用嵌入到我的Job
类中的java.utils.TreeSet
。但是,我担心的是每个未来的差异性:它们会在树集中占据独特的位置吗?如果没有,那么是否有更好的容器可供使用
一种解决方案是,如果一个容器不能胜任,那么它将扩展ExecutorService
,并在每次提交时增加一个计数器,然后将该计数器用作某种散列,以保证唯一性。但这是我渴望避免的开销,特别是如果我的担忧是毫无根据的。由于future没有自己的equals
实现,它将依赖对象的this==obj
。由于正常情况下,ExecutorService
将返回不同的对象,因此您应该不会有问题
但是,我认为任何容器(列表、集合、数组等)都应该这样做,以确保我建议使用(数组)列表如果我需要查找未来,我会将其存储在地图中。以id为键,以未来为值 树集是一个排序集,您不需要对未来进行排序
您也不需要处理重复项,因此不需要设置
简单地使用一个ArrayList
就可以了。澄清一下:“Job”和“Callable”之间是否存在1:n的关系:也就是说,每个Job都由几个Callable组成,当一个Job应该被取消时,它的所有Callable的未来都应该被取消?@Marco13:是的,这是正确的。好的,现在接受了ArrayList
,否则我建议使用Map
(或者类似地,番石榴Multimap
)来轻松管理工作和未来之间的关系;第二双眼睛的价值怎么估计也不为过。