如果其中一个线程完成,则取消线程组

时间:2013-08-14 08:40:01

标签: java multithreading

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

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

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

4 个答案:

答案 0 :(得分:0)

对于Java 2 Platform,Standard Edition 1.4 SDK或更高版本,您可以使用exception chaining

答案 1 :(得分:0)

如何将线程的任务拆分为较小的块并在循环中检查stop条件?

答案 2 :(得分:0)

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

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

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标志,其他所有标志也会停止。将示例扩展为便于中断将是非常简单的。

答案 3 :(得分:0)

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

public class Job implements Runnable {

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

}

在关机代码中你打电话

thread.interrupt();

为每个其他线程。

与stop-flag相比的优势在于你的线程也将退出任何阻塞调用。