0

如果其中一个线程成功完成任务,我正在尝试找出取消一组线程的方案的解决方案。

场景是这样的:假设一组线程正在执行一项任务以在文件中查找字符串,如果任何线程找到该字符串,则其余线程应停止执行。

使用 1.5 并发我们可以做到这一点,但是在 JDK 1.5 之前如果我们想实现这种场景,那我们怎么做呢?

4

4 回答 4

0

对于 Java 2 平台,标准版 1.4 SDK 或更高版本,您可以使用异常链

于 2013-08-14T08:50:27.640 回答
0

将线程的任务分成更小的块并检查stop循环中的条件怎么样?

于 2013-08-14T08:50:42.563 回答
0

您可以中断线程并在每个线程中检查中断标志:

public class Job implements Runnable {

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            // perform stuff
        }
    }

}

在您调用的关闭代码中

thread.interrupt();

对于彼此的线程。

与停止标志相比的优点是您的线程也将退出任何阻塞调用。

于 2013-08-14T09:05:24.423 回答
0

停止线程的好方法是让它定期检查一个指示它是否应该继续的标志。正如 bennihepp 在他的回答中指出的那样,java Thread 类已经有一个称为中断的工具,它在许多场景中都很有用。请参阅Thread 类的 javadoc,尤其是interrupt()isInterrupted()方法。

在以下示例中,可运行类确保所有实例在一个实例完成后(很快)停止。值得注意的是,您应该保持工作单元(循环的一次迭代)足够小。

public class MyRunnable implements Runnable {
  private static boolean shouldStop = false;

  public void run() {
    // allocate required resources
    while (!MyRunnable.shouldStop) {
      // do work

      if (/* some condition to indicate completion */)
        MyRunnable.shouldStop = true;
    }
    // release any allocated resources
  }
}

这个简单的示例假定所有线程都包装了相同类型的可运行对象。一旦一个人设置了shouldStop标志,所有其他人也停止了。扩展示例以方便中断将非常简单。

于 2013-08-14T08:53:07.110 回答