我想阻止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不是一个选项,因为该集将变得非常大,并且由于多线程情况,它显然不起作用。 有没有办法实现这个目标?
答案 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)