我正在使用ExecutorService来处理数千个小型独立任务。完成后,每个任务都会存储结果(true为false)。
因此,如果任务找到了答案,我希望过早关闭线程池,而不是处理所有任务! 感觉我在这里遗漏了一些非常明显的东西......
答案 0 :(得分:2)
考虑使用invokeAny
方法。只有一个完成后它会返回。
答案 1 :(得分:0)
你表达的欲望让我想起了Klein bottle,其中“内部”和“外部”之间的区别很小。在这里,提交给ExecutorService
的任务需要知道他们必须通知线程池外的锁定门,并在第一次从看不到真正的任务结果转变为看到它时关闭它至少有一个。
我不会为你编写代码,但我会草拟解决方案。定义任务完成后必须调用的接口可能会有所帮助:
interface TaskObserver
{
void completed(boolean result);
}
每个任务实例都可以构造为引用这样的TaskObserver
,任务正文在完成之前就会调用它,并将控制权交还给调用ExecutorService
。您甚至可以编写基类来协助参与此协议:
public abstract class ObservableTask implements Callable<Boolean>
{
protected ObservableTask(TaskObserver observer)
{
if (null == observer)
throw NullPointerException();
observer_ = observer;
}
public final Boolean call()
{
final boolean result = evaluate();
observer_.completed(result);
return result;
}
protected abstract boolean evaluate();
private final TaskObserver observer_;
}
或者,除了使用扩展来定义任务之外,您可以编写一个这样的具体类,除了{{1}之外,还在其构造函数中接受引用到Callable<Boolean>
。引用,而是通过委托来完成。
继续,TaskObserver
的实现将存储AtomicBoolean
,最初必须设置为false。如果传递给TaskObserver
的结果为真,则completed(boolean)
方法的主体必须尝试将AtomicBoolean
从false设置为true。如果从false到true的转换成功,请关闭completed(boolean)
并停止提交更多任务;对ExecutorService
的任何后续呼叫呼叫都将来自已提交的任务,并且过于符合取消请求。
TaskObserver
如果这还不足以帮助您入门,请跟进其他问题。