Java中的子线程是否阻止父线程终止?

Joh*_*nny 6 java multithreading

当我在另一个线程中创建并启动一个线程时,它会是一个子线程吗?在子线程运行时是否阻止父线程终止?例如:

new Thread(new Runnable() {
    @Override
    public void run() {
        //Do Sth
        new Thread(new Runnable() {
            @Override
            public void run() {
                //Do Sth
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //Do Sth
                    }
                }).start();
                //Do Sth
            }
        }).start();
        //Do Sth
    }
    //Do Sth            
}).start();
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 13

在您的代码中,对象之间存在父子关系.但是,线程之间没有父子关系的概念.一旦两个线程运行,它们基本上是同行.

假设线程A启动线程B.除非它们之间有明确的同步,否则任何线程都可以随时终止,而不会影响其他线程.

请注意,只要线程存在,任一线程都可以使进程保持活动状态.请参阅Java中的守护程序线程是什么?


Gra*_*ray 6

当我在另一个线程中创建并启动一个线程时,它会是一个子线程吗?

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

// in Thread.init()
this.daemon = parent.isDaemon();
this.priority = parent.getPriority();
Run Code Online (Sandbox Code Playgroud)

当线程开始时,它沿着它的“父”运行,两者之间没有链接。

它是否会在子线程运行时阻止父线程的终止?

不,不是的。但是我怀疑您真的想知道线程是否可以阻止应用程序的终止。如果子线程是非守护进程,那么即使主线程(也是非守护进程)完成,您的应用程序也会等待子线程完成。根据定义,JVM 将等待所有非守护线程完成。一旦最后一个非守护线程完成,JVM 就可以终止。

请参阅:Java 中的守护进程线程是什么?