在满意的条件下停止线程池

时间:2011-09-04 14:08:20

标签: java threadpool concurrent-programming

我正在使用ExecutorService来处理数千个小型独立任务。完成后,每个任务都会存储结果(true为false)。

因此,如果任务找到了答案,我希望过早关闭线程池,而不是处理所有任务! 感觉我在这里遗漏了一些非常明显的东西......

2 个答案:

答案 0 :(得分:2)

答案 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

如果这还不足以帮助您入门,请跟进其他问题。