确保ExectorService

时间:2016-02-21 22:42:46

标签: java multithreading executorservice threadpoolexecutor

我有一个场景,其中相同的任务被多次分配给ExecutorService。我想避免这种情况,有办法吗?

我有一个带有String构造函数的任务。

任务task1 =新任务(“A”); 比我执行这个任务 executor.execute(task1);

然后我用相同的字符串创建另一个任务。

任务task2 =新任务(“A”);

让我说我无法避免这种情况发生。

现在我执行此任务。

executor.execute(task2)。

我只希望执行其中一项任务,因为这两项任务的性质相似。

如何?

1 个答案:

答案 0 :(得分:0)

首先,我将实现一个队列接口并将其传递给执行程序服务。我的实现将使用哈希集来保存内存,在常规集合旁边保存队列所需的任务。因此,添加到我的队列将涉及首先检查hashset。也许是一个关联的hashset滚动了最老的条目......

但是,executorservice submit()并不完全依赖队列。请参阅ThreadPoolExecutor的javadoc。队列可以拒绝任务,但执行者可以生成一个线程而仍然接受该任务。此外,这意味着你无论如何都可以干预遗嘱执行人的建设。

因此,假设对执行程序的类进行控制,似乎必须扩展执行程序服务并在那里知道而不是在自定义队列中。您只需要覆盖submit()并抛出拒绝异常。

当然,这揭示了对提交者的拒绝。你应该优雅地处理它。您无法隐藏这一事实,因为如果没有提交,您将无法返回Future。除非你把旧的Future连接到新的(你的知识hashmap包含Futures)。这可能会带来困难,因为每个Future都有一个'完成'状态并且可以取消...你自己的未来将委托给原始期货。我认为任务拒绝更简单。