我正在我的应用的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;
}
如何在重新启动应用程序时确保旧线程停止?
答案 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();