我有一个场景,其中相同的任务被多次分配给ExecutorService
。我想避免这种情况,有办法吗?
我有一个带有String构造函数的任务。
任务task1 =新任务(“A”); 比我执行这个任务 executor.execute(task1);
然后我用相同的字符串创建另一个任务。
任务task2 =新任务(“A”);
让我说我无法避免这种情况发生。
现在我执行此任务。
executor.execute(task2)。
我只希望执行其中一项任务,因为这两项任务的性质相似。
如何?
答案 0 :(得分:0)
首先,我将实现一个队列接口并将其传递给执行程序服务。我的实现将使用哈希集来保存内存,在常规集合旁边保存队列所需的任务。因此,添加到我的队列将涉及首先检查hashset。也许是一个关联的hashset滚动了最老的条目......
但是,executorservice submit()并不完全依赖队列。请参阅ThreadPoolExecutor的javadoc。队列可以拒绝任务,但执行者可以生成一个线程而仍然接受该任务。此外,这意味着你无论如何都可以干预遗嘱执行人的建设。
因此,假设对执行程序的类进行控制,似乎必须扩展执行程序服务并在那里知道而不是在自定义队列中。您只需要覆盖submit()并抛出拒绝异常。
当然,这揭示了对提交者的拒绝。你应该优雅地处理它。您无法隐藏这一事实,因为如果没有提交,您将无法返回Future。除非你把旧的Future连接到新的(你的知识hashmap包含Futures)。这可能会带来困难,因为每个Future都有一个'完成'状态并且可以取消...你自己的未来将委托给原始期货。我认为任务拒绝更简单。