如何检查线程是否已终止?

10

线程什么时候达到终止状态?当run()方法结束时,线程是否会被终止?

那么如何正确检查线程是否已经终止?因为对我来说,以下条件似乎总是成立:

if(!(thread.getState()).equals("TERMINATED")){}

有什么想法吗?

2个回答

20

首先:Thread.getState()方法返回一个Thread.State对象,它永远不会等于一个String对象,因此您需要写成这样的代码:

if(thread.getState()!=Thread.State.TERMINATED){ }

是的,当run()方法结束(无论是正常结束还是抛出异常),线程都将进入TERMINATED状态。


5
是的,当run()方法结束时(无论是正常结束还是因为抛出异常),线程将进入终止状态。但事实并非如此,如果出现异常等异常情况,它会调用UncaughtExceptionHandler并且可以自由地执行任何操作(包括像Thread.currentThread().run()这样的操作)。线程在exit()方法之后处于终止状态,该方法可以在ThreadGroup同步上阻塞(可能是无限期的)。 - bestsss
1
@bestsss:我希望没有人注意到那个小漏洞;-) 当然,你是对的。 - Joachim Sauer
对我来说不起作用,即使线程仍在播放声音,也会返回TERMINATED。 - Simon
@SimonMeier:这听起来(开玩笑)像你的线程实际上已经结束了,但是无论你使用哪个播放声音的库,在调用返回后继续播放。我不是 Java 播放声音方面的专家,但我知道这很常见(即你的方法调用只是安排一些声音播放并在实际播放完成之前就返回了)。 - Joachim Sauer
好的...但是如果那个线程中有Thread.sleep()呢?我正在通过设置大约半秒钟的休眠时间按顺序播放短声音,这意味着总共该线程应该存活约4秒钟,而它会重复调用Android MediaPlayer来播放声音... - Simon

15

测试方法thread.isAlive()

或者选择使用thread.join()直到线程执行完成。


1
显然,.isAlive() 存在一些时间问题:https://dev59.com/r07Sa4cB1Zd3GeqP6L1H - Simon
@simon 我认为那里得出的结论是误导性的。很明显,线程状态是异步设置的,因此不能指望在启动线程后立即测试它能够正常工作。事实上,我预计使用 getState() 的结果不会有任何不同。 - orodbhen

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