所有的答案都是关于如何停止某些线程的循环,但是如果我没有一个循环,但我仍然希望在线程执行/处理所有行之前停止它呢?
例如,我有一个线程,它通常运行7-10秒,然后死掉(终止):
mThread = new Thread(new Runnable() {
@Override
public void run() {
// some code here
// some here
// some here
// some here
// some here
// all lines takes about 7-10 seconds
}
});
如果我启动了一个线程,在2到3秒后我需要停止它,那么如何做它,而不等待10秒呢?
发布于 2018-03-23 12:52:00
如果您的线程没有被阻塞,并且实际上正在处理内容,那么中断它可能没有帮助。您可以对该线程进行编码,以检查当前线程上的中断标志,然后如果它看到已设置该标志,则停止。
这是检查当前线程是否已被中断的方法。
Thread.currentThread().isInterrupted();
所以你必须像这样编码你的线程..。
mThread = new Thread(new Runnable() {
@Override
public void run() {
// some code here
if (Thread.currentThread().isInterrupted()) return;
// some here
if (Thread.currentThread().isInterrupted()) return;
// some here
if (Thread.currentThread().isInterrupted()) return;
// some here
if (Thread.currentThread().isInterrupted()) return;
// some here
// all lines takes about 7-10 seconds
}
});
然后,您可以继续并中断mThread,它将有一个效果。尽管它仍将继续处理当前的some here
步骤。
发布于 2018-03-23 12:58:27
解释
首选的方法是在线程中实现停止机制。您还可以尝试观察interrupt
标志。您可以使用Thread#interrupt
方法从外部中断,线程可以使用Thread#isInterrupted
和Thread#interrupted
检查标志(参见线程文档)。
没有实际实现逻辑的线程,就没有办法从外部强制线程停止。有Thread#stop
方法,但它是不推荐的,不应该使用。从它的文档
不赞成。此方法本质上是不安全的。使用
Thread.stop
停止线程会导致它解锁它锁定的所有监视器(这是未检查的ThreadDeath
异常在堆栈上传播的自然结果)。如果以前受这些监视器保护的任何对象处于不一致的状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。许多stop的用法应该被简单地修改一些变量以指示目标线程应该停止运行的代码所取代。目标线程应该定期检查该变量,如果变量指示要停止运行,则应该以有序的方式从它的run方法返回。如果目标线程等待很长时间(例如,在条件变量上),则应使用中断方法中断等待。有关更多信息,请参见为什么Thread.stop、Thread.suspend和Thread.resume不受欢迎?。
解决方案
您可以这样修改线程:
public class MyThread implements Runnable {
private volatile boolean mShouldStop = false;
public void shutdown() {
mShouldStop = true;
}
@Override
public void run() {
// First line ...
if (mShouldStop) return;
// Second line ...
if (mShouldStop) return;
// Third line ...
if (mShouldStop) return;
}
}
因此,您需要定期检查标志,然后手动中止。
通常这样的线程有某种while (true)
循环。在这种情况下,您可以这样做:
@Override
public void run() {
while (!mShouldStop) {
// Do something ...
}
}
根据应用程序的不同,您可以将中断标志解释为线程关闭的信号。那么你的代码看起来就像
@Override
public void run() {
while (!Thread.interrupted()) {
// Do something ...
}
}
备注
mShouldStop
需要是volatile
,以确保为Thread
正确地更新它。请参阅Oraclefor原子存取的教程。
https://stackoverflow.com/questions/49449901
复制相似问题