如果其中一个线程成功完成任务,我正在尝试找出取消一组线程的方案的解决方案。
场景是这样的:假设一组线程正在执行一项任务以在文件中查找字符串,如果任何线程找到该字符串,则其余线程应停止执行。
使用 1.5 并发我们可以做到这一点,但是在 JDK 1.5 之前如果我们想实现这种场景,那我们怎么做呢?
如果其中一个线程成功完成任务,我正在尝试找出取消一组线程的方案的解决方案。
场景是这样的:假设一组线程正在执行一项任务以在文件中查找字符串,如果任何线程找到该字符串,则其余线程应停止执行。
使用 1.5 并发我们可以做到这一点,但是在 JDK 1.5 之前如果我们想实现这种场景,那我们怎么做呢?
对于 Java 2 平台,标准版 1.4 SDK 或更高版本,您可以使用异常链。
将线程的任务分成更小的块并检查stop
循环中的条件怎么样?
您可以中断线程并在每个线程中检查中断标志:
public class Job implements Runnable {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
// perform stuff
}
}
}
在您调用的关闭代码中
thread.interrupt();
对于彼此的线程。
与停止标志相比的优点是您的线程也将退出任何阻塞调用。
停止线程的好方法是让它定期检查一个指示它是否应该继续的标志。正如 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
标志,所有其他人也停止了。扩展示例以方便中断将非常简单。