【问题标题】:How can child threads still execute even after that their parent thread die or terminate?即使在其父线程死亡或终止之后,子线程如何仍然执行?
【发布时间】:2014-04-05 12:20:10
【问题描述】:

这是我的两个课程:

public class Firstclass {
    public static void main(String args[]) throws InterruptedException {
        System.out.println("Main start....");
        Secondclass t1 = new Secondclass();
        t1.setName("First Thread");
        Secondclass t2 = new Secondclass();
        t2.setName("Second Thread");
        t1.start();
        t2.start();
        System.out.println("Main close...");
    }
}

public class Secondclass extends Thread {
    @Override
    public void run() {
        try {
            loop();
        } catch(Exception e) {
            System.out.println("exception is" + e);
        }
    }

    public void loop() throws InterruptedException {
        for(int i = 0; i <= 10; i++) {
            Thread t = Thread.currentThread();
            String threadname = t.getName();
            if(threadname.equals("First Thread")) {
                Thread.sleep(1000);
            } else {
                Thread.sleep(1500);
            }
            System.out.println("i==" + i);   
        }   
    }    
}

现在当我运行Firstclass 时,输出为:

Main start....
Main close...
i==0
i==0
i==1
i==1
i==2
i==3
i==2
i==4
i==3
i==5
i==6
i==4
i==7
i==5
i==8
i==9
i==6
i==10
i==7
i==8
i==9
i==10

我的问题是:让我们考虑 main 方法由 JVM 中的线程“T”执行,t1 和 t2 显然是父线程 T 的子线程,所以当作为 main 方法的 T 线程死亡时T1 和 T2 怎么还能执行并给我们输出。因为如果父线程死亡或终止,那么子线程也应该死亡或终止。

【问题讨论】:

  • 如果您将这些线程作为守护线程运行,当主线程完成时,您的应用程序将退出。看看“守护进程”线程。当唯一运行的线程是守护线程时,JVM 将退出。 The Java Virtual Machine exits when the only threads running are all daemon threads.
  • 多线程的全部意义在于获得同时动作。主线程和其他线程将在执行中轮换。如果您在线程上调用了 .join() 方法,这将确保其他线程在主线程继续之前完成执行。
  • @SOlace 和 @anonymous 我知道守护线程和用户线程之间的区别,但现在让我们避免即使父线程死亡,子线程如何执行?
  • 请从您的机器上删除该 mtu 链接的所有痕迹并刻录所有硬拷贝。这太糟糕了,以至于超出了它的叙述范围。
  • @Martin 所以你是说即使作为主线程的父线程退出子线程仍然执行。如果这是你的意思,那么请提供你的答案来源。如果你可以提供来自的链接oracle.docs 太棒了。

标签: java multithreading jvm


【解决方案1】:

线程之间没有父子关系的概念。一旦两个线程运行,它们基本上就是对等的。主线程可以退出,而其他线程仍在运行。

Java 没有“子”线程的真正概念。当您启动一个线程时,它会从“父”继承守护进程和优先级,但这就是父/子关系的结束。

【讨论】:

  • 我在读这篇文章 (cs.mtu.edu/~shene/NSF-3/e-Book/FUNDAMENTALS/…) 他们说'如果父线程终止,它的所有子线程也会终止'。那么你现在的意见是什么,你能提供源吗你的答案。
  • 从您的收藏夹中删除该链接。如果您有硬拷贝,请刻录它。所包含的“信息”弊大于利:(
  • @MartinJames,希望你回答了问题 OP,而不是我!
  • @Kugathasan 所以你是说即使作为主线程的父线程退出子线程仍然执行。如果这是你的意思,那么请提供你的答案来源。如果你可以提供来自的链接oracle.docs 太棒了。
  • @karthik 我已经看到了,但我没有得到答案
【解决方案2】:

Java 不知道子线程的概念。您的三个线程被平等对待。接下来你的想法是创建守护线程,当最后一个 java 非守护线程停止时终止。

您发布的论文是关于一个名为 ThreadMentor 的学习系统。但是这个系统的行为与 Java不同,这与 Java 无关。

这里可能是关于 Java 线程模型的一个好的开始:

http://docs.oracle.com/javase/tutorial/essential/concurrency/

【讨论】:

  • 我正在阅读这篇文章 (cs.mtu.edu/~shene/NSF-3/e-Book/FUNDAMENTALS/...) 他们说'如果父线程终止,它的所有子线程线程也终止了'。那么你现在的意见是什么,你能提供答案的来源吗?
  • 守护线程不会在主线程终止时停止。它们在最后一个非守护线程终止时停止。主线程是非守护线程,但不一定是最后一个终止的。
  • 你是对的。我指的是他的例子,但现在概括了它。谢谢
【解决方案3】:

在这个应用程序中,主线程首先启动并且正在运行,即使你已经启动了t1和t2它们进入就绪状态但它们没有运行,当前运行的线程是主线程。一旦主线程完成了它的所有语句,它并没有立即死亡,它会一直等待,直到它完成它的子线程执行。就像在上面的案例中发生的那样。

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多