2

我想阻止 Executor 运行任何更多 Future 对象,即使它们已提交给 Executor。通过 Executor 让多个线程运行都可以正常工作,但是当 Callable 之一返回 Boolean TRUE 时,Executor 应该停止。当前正在运行的 Future 完成很好,但继续其余部分将是浪费时间。

Set<Future<Boolean>> calculationSet = new HashSet<Future<Boolean>>();
threadPool = Executors.newFixedThreadPool(3);

int x = nextX();
int y = nextY();

do {
   Callable<Boolean> mathCalculation = new MathCalculation(x, y);
   Future<Boolean> futureAttempt = threadPool.submit(mathCalculation);
   calculationSet.add(futureAttempt);

   x = nextX();
   y = nextY();
} while (runSomeMore());

其中 MathCalculation 实现了 Callable 接口,其 call() 方法返回一个布尔值。

在每次迭代时搜索calculationSet 不是一个选项,因为该集合会变得非常大,并且由于多线程情况,它显然无法工作。有没有办法做到这一点?

4

2 回答 2

2

您还可以使用 ExecutorCompletionService

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorCompletionService.html

此 JavaDoc 顶部有两个示例,第二个示例说:

假设......您想使用任务集的第一个非空结果,忽略任何遇到异常的任务,并在第一个任务准备好时取消所有其他任务: ”,然后是示例代码。

Thant 听起来很有希望,它解决了你的问题吗?

于 2011-02-09T22:01:22.637 回答
0

如果您希望 callable 停止执行程序服务,我建议您创建一个包装器或更改 Callable 来执行此操作。

// performs a threadPool.shutdownNow() as required.
new MathCalculation(x, y, threadPool) 
于 2011-02-09T17:48:19.557 回答