如何停止一个线程?

14

当一个线程在运行时,如何停止这个线程?我已经尝试过以下方法:

if(thread.isAlive()){
    thread.stop();
}

但是stop方法已被弃用并会抛出异常。

01-21 14:12:40.188: ERROR/global(535):     Deprecated Thread methods are not supported.
01-21 14:12:40.188: ERROR/global(535):    java.lang.UnsupportedOperationException
01-21 14:12:40.188: ERROR/global(535):     at java.lang.VMThread.stop(VMThread.java:85)
01-21 14:12:40.188: ERROR/global(535):     at java.lang.Thread.stop(Thread.java:1379)
01-21 14:12:40.188: ERROR/global(535):     at java.lang.Thread.stop(Thread.java:1344)

我们该如何解决这个问题?


3
“Deprecated Thread methods are not supported” 的意思是“废弃的线程方法不被支持”。 - GolezTrol
4个回答

37

通常情况下,不要强制停止线程,因为这很危险。你可以设置一个标志,告诉相关的线程在受控条件下退出它的线程循环。

你的线程循环大概长这个样子:

void run() {
  while (shouldContinue) {
    doThreadWorkUnit();
  }
}

在其他地方,你设置了shouldContinue变量并等待线程完成:

...
thread.shouldContinue = false;
thread.join();
...

(所有这些都可能不是正确的 Java 代码,因为我不使用 Java。将其视为伪代码,并修改为您实际使用的语言/线程库等。)


1
我同意你的观点,但是对于非循环线程呢?我的意思是像重 IO 操作这样的情况,调用 "interrupt()" 是一个好的做法吗? - mdelolmo
@mdelolmo,我认为不需要中断线程。你仍要设置取消标志并忽略它。如果它是阻塞的,则无论如何都不会使用任何CPU。但我相信也有其他意见。请注意我的文章中的“一般”这个词 - 我相信有例外情况。肯定会有人提出嵌入式环境或类似情况,您总是会中断线程的。;) - Jakob Borg
如果您正在使用HandlerThread,只需调用quit()或quitSafely(),它会代表您执行此操作。对于具有长时间阻塞部分的线程,您可能希望定期插入检查以查看线程是否需要退出。 - Dorje

3

2
最好使用线程的这种方法来停止它。
Thread.interrupt();

这样你也可以保存线程的状态。


0
在非循环线程实现中,您始终可以在线程代码的开头使用类似于以下内容的东西:

void run() {
    if (!shouldContinue) { 
       return 1; 
    } 
    .. 
    then rest of the thread code
    ..
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接