当Callable返回特定结果时停止Executor

时间:2011-02-09 17:31:56

标签: java future executor callable

我想阻止Executor运行任何更多的Future对象,即使它们已经提交给Executor。 通过Executor运行多个线程一切正常,但是当其中一个Callable返回一个布尔值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()方法返回一个布尔值。

在每次迭代中搜索calculateSet不是一个选项,因为该集将变得非常大,并且由于多线程情况,它显然不起作用。 有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

您也可以使用ExecutorCompletionService

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

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

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

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

答案 1 :(得分:0)

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

// performs a threadPool.shutdownNow() as required.
new MathCalculation(x, y, threadPool)