线程内嵌线程:如果父线程被终止会发生什么?

4

我有关线程的问题不太明白,特别是在使用Java和Android时。

假设我有一个名为A的线程,它启动了线程B。如果线程A停止了,那么线程B仍然会继续运行。这是怎么实现的?线程B属于谁?主线程吗?

Thread类

public class ParentThread extends Thread {

    public void run(){
        Log.e("PARENT THREAD", "STARTS RUNNING");
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    Log.e("CHILD THREAD", "IS ALIVE");
                    try {
                        Thread.sleep(1000);
                    }
                    catch (InterruptedException exc) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        Log.e("PARENT THREAD", "STOPS RUNNING");
    }
}

活动

new ParentThread().start();

Logcat 输出

01-07 13:45:16.726 22063-22081/? E/PARENT THREAD: STARTS RUNNING
01-07 13:45:16.726 22063-22081/? E/PARENT THREAD: STOPS RUNNING
01-07 13:45:16.727 22063-22082/? E/CHILD THREAD: IS ALIVE
01-07 13:45:17.727 22063-22082/? E/CHILD THREAD: IS ALIVE
01-07 13:45:18.727 22063-22082/? E/CHILD THREAD: IS ALIVE
01-07 13:45:19.727 22063-22082/? E/CHILD THREAD: IS ALIVE
...

2
线程不归属于彼此,它们甚至没有父母。 - user253751
当你处理进程时,你会发现这种父/子所有权结构,而不是处理线程时。 - ParkerHalo
是的,比如在 C 语言中使用 fork() 函数? - Scaraux
2个回答

5

来自Thread文档

线程是执行的并发单位。它有自己的调用堆栈、参数和本地变量。每个应用程序在启动时都会至少运行一个线程,即主线程,在主ThreadGroup中。运行时将其自己的线程保存在系统线程组中。


这正是我想要的... 我应该先阅读 Android 文档。谢谢! - Scaraux

4
假设我有一个名为A的线程,它启动了一个线程B。如果线程A停止,线程B将继续存在。这是如何实现的?
这很容易实现-没有任何东西会使线程B停止,因此它不会停止。
现在线程B属于谁?主线程吗?
线程之间没有归属关系。记录线程A启动了线程B的事实并不会被保存-就系统而言,你有两个没有任何关系的线程。

1
那个答案有什么问题吗? - Scaraux
@gio 你确定你不是过于敏感了吗? - user253751
不好的例子,涉及到父母。 - gio
@gio 为什么不呢?如果你的父母去世了,你不会死亡,因为你和你的父母之间没有物理联系 - 就像线程一样。 - user253751

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接