首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >停止线程,它不包括while语句

停止线程,它不包括while语句
EN

Stack Overflow用户
提问于 2018-03-23 12:40:09
回答 4查看 88关注 0票数 0

所有的答案都是关于如何停止某些线程的循环,但是如果我没有一个循环,但我仍然希望在线程执行/处理所有行之前停止它呢?

例如,我有一个线程,它通常运行7-10秒,然后死掉(终止):

代码语言:javascript
运行
复制
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秒呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-23 12:52:00

如果您的线程没有被阻塞,并且实际上正在处理内容,那么中断它可能没有帮助。您可以对该线程进行编码,以检查当前线程上的中断标志,然后如果它看到已设置该标志,则停止。

这是检查当前线程是否已被中断的方法。

代码语言:javascript
运行
复制
Thread.currentThread().isInterrupted();

所以你必须像这样编码你的线程..。

代码语言:javascript
运行
复制
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步骤。

票数 3
EN

Stack Overflow用户

发布于 2018-03-23 12:58:27

解释

首选的方法是在线程中实现停止机制。您还可以尝试观察interrupt标志。您可以使用Thread#interrupt方法从外部中断,线程可以使用Thread#isInterruptedThread#interrupted检查标志(参见线程文档)。

没有实际实现逻辑的线程,就没有办法从外部强制线程停止。有Thread#stop方法,但它是不推荐的,不应该使用。从它的文档

不赞成。此方法本质上是不安全的。使用Thread.stop停止线程会导致它解锁它锁定的所有监视器(这是未检查的ThreadDeath异常在堆栈上传播的自然结果)。如果以前受这些监视器保护的任何对象处于不一致的状态,则损坏的对象将对其他线程可见,从而可能导致任意行为。许多stop的用法应该被简单地修改一些变量以指示目标线程应该停止运行的代码所取代。目标线程应该定期检查该变量,如果变量指示要停止运行,则应该以有序的方式从它的run方法返回。如果目标线程等待很长时间(例如,在条件变量上),则应使用中断方法中断等待。有关更多信息,请参见为什么Thread.stop、Thread.suspend和Thread.resume不受欢迎?

解决方案

您可以这样修改线程:

代码语言:javascript
运行
复制
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)循环。在这种情况下,您可以这样做:

代码语言:javascript
运行
复制
@Override
public void run() {
    while (!mShouldStop) {
        // Do something ...
    }
}

根据应用程序的不同,您可以将中断标志解释为线程关闭的信号。那么你的代码看起来就像

代码语言:javascript
运行
复制
@Override
public void run() {
    while (!Thread.interrupted()) {
        // Do something ...
    }
}

备注

mShouldStop需要是volatile,以确保为Thread正确地更新它。请参阅Oraclefor原子存取的教程。

票数 3
EN

Stack Overflow用户

发布于 2018-03-23 12:45:01

您可以用mThread.interrupt()中断线程。但是,要使其工作,您的线程需要检查中断状态(通过休眠)。看看这个线程

有关更多细节,请参阅此线程

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49449901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档