【问题标题】:When is a Java thread alive?Java 线程何时存活?
【发布时间】:2013-06-22 00:17:38
【问题描述】:

这是一个关于 Java 线程词汇的非常基本的问题。

我看不到任何可能的重复项,但可能有。

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

run()方法还没有完成的时候还是其他参数?

【问题讨论】:

标签: java multithreading


【解决方案1】:

根据您提到的 Javadoc:

如果线程已启动且尚未死亡,则线程处于活动状态。

当调用其start() 方法并在其run() 方法结束时或当调用stop()(现已弃用)时,线程“启动”。所以是的,一个线程在其run() 方法仍在运行时是“活动的”,但它在start() 的调用和JVM 对run() 方法的隐式调用之间的时间窗口内也是“活动的” .

您也可以查看@Marou Maroun 建议的Thread.getState()interesting information about Thread States

我也遵循他的建议警告您,如果抛出传播到run 之外的异常,线程可能会提前结束。在这种情况下,线程将不再存在。

编辑:正如@zakkak 所建议的,即使run() 方法尚未启动,线程也可以被认为是活动的。如果您想正确控制何时调用它,请使用ScheduledExecutorService,特别是schedule() 方法,它可以为您提供更精确的执行计划。

【讨论】:

  • 我更新了我的答案以包含您的链接和您的评论。它现在是你的一半 :)
  • 这都是你的 :) 很好解释的答案。
  • 请注意,Thread#stop 只不过是异步抛出异常。如果该异常没有导致 run 方法中止,则线程继续存在。
  • @MarounMaroun 我最近意识到了这一点,现在传播这个词:) 文档确实说明了这一点,但是以这样一种迂回的方式,听起来好像抛出了异常而没有机会捕捉到它。
  • @zakkak 然而,你必须做一些假设:正如javadoc所说,一旦你调用了start(),你必须假设你的线程已经启动。如果您需要精确控制run(),您应该在ScheduledExecutorService 中使用Runnable,或者使用带有实时调度程序的操作系统(使用适当的JVM)。考虑到这一点,我会看看如何更新我的答案。
【解决方案2】:

从您创建 Thread 对象并启动它直到它完成 run 方法或死亡的那一刻,线程被认为是活着的。即使处于空闲、运行或睡眠状态,也会说它处于活动状态。

【讨论】:

    【解决方案3】:

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

    从活到死,它可以从runnable状态移动到waiting状态。

    【讨论】:

      【解决方案4】:

      在 start() 返回后,直到 run() 返回 JVM,线程仍处于活动状态。

      【讨论】:

      • 完美答案!
      【解决方案5】:

      线程处于新状态或运行/等待状态时是活动的。而且我们还可以看出,在线程死亡之前,它在内存中是活动的。

      【讨论】:

        【解决方案6】:

        Thread is "Alive" 表示 Thread 仍在运行。

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

        此外,isAlive() 方法用于知道 Thread 是否还在运行。

        final boolean isAlive()
        

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

        【讨论】:

          【解决方案7】:

          线程处于新/运行/等待状态时是活动的。本质上,run 方法可以运行也可以不运行

          【讨论】:

          • 您必须 start() 线程才能使其处于活动状态:MyThread t = new MyThread(); t.isAlive(); 返回 'false'
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-27
          • 2015-09-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多