Java线程何时是活着的?

25

这是关于Java线程词汇的一个相当基础的问题。

我没有发现任何可能的重复,但也许有。

alive 这个单词在Oracle文档中指的是什么?

它是指当 run() 方法尚未完成时还是其它参数呢?


12
答案在这里:“如果线程已经启动且尚未死亡,则该线程处于活动状态”。这个链接也应该对你有帮助:http://journals.ecs.soton.ac.uk/java/tutorial/java/threads/states.html。 - Maroun
7个回答

31
根据您提到的Javadoc:
线程在启动且未死亡时是活动的。
当调用其start()方法时,线程“启动”,并在其run()方法结束或调用stop()(现已弃用)时“死亡”。因此,在run()方法仍在进行时,线程是“活动”的,但在JVM隐式调用run()方法之前的时间窗口中也是“活动”的。
您还可以检查Thread.getState()关于线程状态的有趣信息,这是@Marou Maroun建议的。
我还遵循他的建议警告您,如果抛出传播超出run的异常,线程可能会过早结束。在这种情况下,该线程将不再处于活动状态。

编辑:根据@zakkak的建议,即使run()方法尚未启动,该线程也可以被视为处于活动状态。如果您想要对其何时调用进行适当控制,请使用ScheduledExecutorService,特别是schedule()方法,它可以给您提供更精确的执行计划。


1
我更新了我的答案,包含了你的链接和评论。现在它是一半属于你的 :) - Matthieu
4
都是你的 :) 解释得很清楚。 - Maroun
4
请注意,Thread#stop 方法无非是异步抛出一个异常。如果该异常并没有导致 run 方法中止,那么该线程仍会继续执行。 - Marko Topolnik
1
@MarounMaroun 我最近意识到这一点,现在正在传播这个消息 :) 文档确实说明了这一点,但用非常迂回的方式表达,让人觉得异常会被抛出而无法捕获。 - Marko Topolnik
2
@zakkak,你必须做出一些假设:正如javadoc所述,一旦调用了start(),你必须假设你的线程已经启动。如果你需要对run()有精确的控制,你应该在ScheduledExecutorService中使用一个Runnable,或者使用带有实时调度程序的操作系统(具有适当的JVM)。我会考虑如何更新我的答案来考虑这一点。 - Matthieu
显示剩余5条评论

4

在调用start()方法后,线程处于活动状态直到run()方法执行完并返回到JVM。


完美答案! - ulab

2

当线程处于新建、运行或等待状态时,它就是活动的。实际上,run() 方法可能正在运行,也可能没有在运行。


你必须调用 start() 方法来启动线程,使其处于活动状态:MyThread t = new MyThread(); t.isAlive(); 返回 'false'。 - Matthieu

1

当调用线程的start方法并且线程未死亡时,该线程是活动状态。它可以在死亡之前多次进入等待状态,即使在等待状态下,它仍然处于活动状态。

从活动状态到死亡状态,它可以从可运行状态转移到等待状态。


0

线程被认为是从创建Thread对象并启动它直到完成运行方法或死亡的时刻才算存活。即使处于空闲、运行或睡眠状态,它仍然被视为处于存活状态。


0

线程状态为“Alive”表示线程仍在运行。

可以说正在执行run()方法的线程是活动的线程。

此外,可以使用isAlive()方法来判断线程是否仍在运行。

final boolean isAlive()

isAlive() 方法返回 true,如果调用它的线程仍在运行,则返回 true。否则返回 false。


0

当线程处于新状态或运行/等待状态时,它是活着的。我们也可以说,在线程死亡之前,它在内存中是活着的。


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