【问题标题】:Will a Java thread be adopted by another thread if the thread which created it exits while it is running?如果创建 Java 线程的线程在运行时退出,它会被另一个线程采用吗?
【发布时间】:2017-11-23 22:08:19
【问题描述】:

在 Linux 中,如果一个进程 fork 一个子进程,然后在子进程继续运行时退出,则子进程将被init 进程采用。

不知道java线程是否也会发生类似的事情?

Java线程之间有父子关系吗?

当一个Java线程创建另一个线程并且没有调用join()来等待另一个线程完成运行,并且在另一个线程运行时存在,那么另一个线程会被另一个Java线程采用吗?

谢谢。

【问题讨论】:

  • Java 中没有“所有权”/“父母身份”的概念。您要么有对该线程的引用(因此可以在其上调用join/interrupt 等),或者您没有。

标签: java multithreading


【解决方案1】:

Java线程之间有父子关系吗?

没有。因此也没有采用。

【讨论】:

    【解决方案2】:

    Java线程之间有父子关系吗?

    不,没有这种关系。

    虽然前几章中的大部分讨论只涉及一次执行单个语句或表达式的代码行为,也就是说,由单个线程执行,但 Java 虚拟机可以支持多个执行线程一次。 这些线程独立地执行对位于共享主内存中的值和对象进行操作的代码。 线程可以通过拥有多个硬件处理器、对单个硬件处理器进行时间切片或对多个硬件处理器进行时间切片来支持硬件处理器。

    线程由Thread 类表示。用户创建线程的唯一方法是创建此类的对象;每个线程都与这样一个对象相关联。当在相应的Thread 对象上调用start() 方法时,将启动一个线程。

    ——Java SE > Java SE Specifications > Java Language Specification > Chapter 17. Threads and Locks.

    另外,请参考Thread class (Java Platform SE 8)的文档:这里没有提到这种关系。


    当一个Java线程创建另一个线程并且没有调用join()等待另一个线程完成运行,并且在另一个线程运行时存在,那么另一个线程是否会被另一个Java线程采用?

    不,创建的(第二个)线程不会被任何其他线程采用。但是,请注意:

    Java 虚拟机继续执行线程,直到以下任一情况发生

    • Runtime 类的 exit 方法已被调用,安全管理器已允许执行退出操作。
    • 不是守护线程的所有线程都已死亡,要么从对 run 方法的调用返回,要么抛出传播到 run 方法之外的异常。

    ——Thread class (Java Platform SE 8).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多