如何停止线程?

时间:2017-04-19 17:51:05

标签: java android multithreading

我正在我的应用的onCreate()方法中开始一个新线程,如下所示:

stepsLogger = new Runnable() { 

while(!Thread.currentThread().isInterrupted()){

    //my code

    try {
        Thread.currentThread().sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
  }
};

loggerThread = new Thread(stepsLogger);
loggerThread.start();

虽然它不是interrupted,但它应该每10秒做一次。

我正在Runnable的开头记录一些文本,以查看代码运行的频率。我第一次运行应用程序时很好,但每次重新启动时,文本都会更频繁地记录,这意味着正在运行更多线程。

我试图在onDestroy()方法中停止它们:

@Override
protected void onDestroy() {
    super.onDestroy();
    loggerThread.interrupt();
    loggerThread = null;
}

如何在重新启动应用程序时确保旧线程停止?

2 个答案:

答案 0 :(得分:1)

Thread.interrupt()将使用InterruptedException唤醒一个睡眠线程,因此您已经完成了大部分路径。我将通过以下方式更改您的循环:

while (true) {
  // some code
  try {
    Thread.currentThread().sleep(10000);
  } catch (InterruptedException e) {
    Thread.currentThread().interrupt(); // restore the thread's interrupted flag
    break;
  }
}

关于重新中断线程的一点是微妙的。您可以在本文中从其中一个主要JVM架构师中了解有关它的更多信息:https://www.ibm.com/developerworks/library/j-jtp05236/

如果这个链接死了,它的要点是可以有多个收件人"线程中断。捕获异常会隐式清除线程的中断标志,因此再次设置它是有用的。

答案 1 :(得分:0)

您可以使用volatile布尔变量来确定何时停止。像这样:

class WorkerRunnable implements Runnable {

    private volatile boolean shouldKeepRunning = true;
    public void terminate() {
        shouldKeepRunning = false;
    }

    @Override
    public void run() {
        while (shouldKeepRunning) {
            // Do your stuff
        }
    }
}

开始吧:

WorkerRunnable runnable = new WorkerRunnable();
new Thread(runnable).start();

要阻止它:

runnable.terminate();