如果其中一个线程成功完成任务,我试图找出取消一组线程的方案的解决方案。
场景是这样的:假设一组线程正在处理任务以在文件中查找字符串,并且如果任何线程找到字符串,则剩余的步骤应该停止执行。
使用1.5并发我们可以实现这一点,但是如果我们想要实现这种情况,那么在JDK 1.5之前,我们该怎么做呢?
答案 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相比的优势在于你的线程也将退出任何阻塞调用。