如何停止通过实现可运行接口创建的线程?
我通过实现可运行的接口创建了类,然后在我项目的其他类中创建了许多线程(近10个)。
如何停止其中一些线程?
我通过实现可运行的接口创建了类,然后在我项目的其他类中创建了许多线程(近10个)。
如何停止其中一些线程?
最简单的方法是它,这将导致 返回 ,并且在某些情况下线程正在等待时也可能抛出一个,例如,等。interrupt()
Thread.currentThread().isInterrupted()
true
InterruptedException
Thread.sleep()
otherThread.join()
object.wait()
在方法中,您需要捕获该异常和/或定期检查值并执行某些操作(例如,break out)。run()
Thread.currentThread().isInterrupted()
注意:虽然看起来与 相同,但它有一个令人讨厌的副作用:调用清除标志,而调用则不清除标志。Thread.interrupted()
isInterrupted()
interrupted()
interrupted
isInterrupted()
其他非中断方法涉及使用正在运行的线程监视的“stop”() 标志。volatile
如何停止通过实现可运行接口创建的线程?
您可以通过多种方式停止线程,但所有方法都需要特定的代码来执行此操作。停止线程的典型方法是让线程每隔一段时间检查一次字段:volatile boolean shutdown
// set this to true to stop the thread
volatile boolean shutdown = false;
...
public void run() {
while (!shutdown) {
// continue processing
}
}
您还可以中断导致 、 和一些其他方法抛出 的线程。您还应该使用如下内容测试线程中断标志:sleep()
wait()
InterruptedException
public void run() {
while (!Thread.currentThread().isInterrupted()) {
// continue processing
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// good practice
Thread.currentThread().interrupt();
return;
}
}
}
请注意,中断线程并不一定会导致它立即引发异常。只有当您处于可中断的方法中时,才会抛出 。interrupt()
InterruptedException
如果你想向你的类中添加一个实现的方法,你应该定义你自己的类,如下所示:shutdown()
Runnable
public class MyRunnable implements Runnable {
private volatile boolean shutdown;
public void run() {
while (!shutdown) {
...
}
}
public void shutdown() {
shutdown = true;
}
}