【问题标题】:Is a thread guaranteed to have started when Thread.start() returns?当 Thread.start() 返回时,是否保证线程已经启动?
【发布时间】:2013-08-05 17:26:07
【问题描述】:

我尝试了一些示例代码:

Thread thread = new TestThread();
thread.start();
thread.isAlive();

在我看来,isAlive() 调用返回 false 的唯一方法是让线程已经完成。这是真的吗?

Java 7 JavaDoc 开始:

使该线程开始执行; Java 虚拟机调用该线程的 run 方法。 结果是两个线程同时运行:当前线程(从调用 start 方法返回)和另一个线程(执行它的 run 方法)。

多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。

isAlive 的 Java 7 JavaDoc:

测试这个线程是否还活着。如果线程已启动且尚未死亡,则该线程处于活动状态。

在我看来,这些都不是很有结论性的。

【问题讨论】:

  • 您对“开始”的确切含义是什么?
  • 在示例代码中,线程很可能已经死亡,因为它没有Runnable
  • @draksia 你怎么知道 TestThread 类中什么都没有?
  • @draksia 同意,但这更像是伪代码。我使用的实际测试代码涉及一些睡眠时间,这样我就可以在我几乎确定线程仍然活着时进行调用,反之亦然。
  • 我的错误我以为它只是一个Thread 不是扩展版本。

标签: java multithreading


【解决方案1】:
  • someThread.start() 语句将导致该线程进入 可运行状态
  • 不保证会在调用start() 后立即开始执行其run 方法。
  • 究竟何时执行线程,完全取决于线程调度程序。
  • someThread.start()被调用时,线程可以从runnable进入runnable状态,甚至是waiting状态。

测试这个线程是否还活着。如果线程已启动且尚未死亡,则该线程处于活动状态。

这意味着,当它的start() 被调用并且它的run() 尚未完成时,线程是活动的。 run() 方法的完成意味着线程已死。

【讨论】:

  • 我将其解释为是的,因为 isAlive() 最有可能检查线程的状态,并且您似乎表明线程在启动调用期间同步离开了可运行状态。对吗?
  • 离开可运行状态取决于线程调度程序。 isAlive() 将检查状态。线程可以在其run 方法执行期间在运行、可运行和等待状态之间切换
【解决方案2】:

线程已经启动并不意味着它已经在执行run方法,而是它的状态是Alive。

所以在返回 start 后,线程是存活的,但不保证正在执行 run 方法,它的状态可以是除了 start 方法完成后的 New 之外的任何东西。 (可运行、等待、终止等)

t.isAlive() returns true if t is not in the NEW or TERMINATED state

还可以在 java threading 上查看这个很棒的资源

【讨论】:

    【解决方案3】:

    只要t.start() 返回并直到t.run() 完成,线程t 就处于活动状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      相关资源
      最近更新 更多