当前位置: 首页 > 面试题库 >

主线程可以在子线程之前死掉吗

夏星阑
2023-03-14
问题内容

我相信主线程不能在子线程之前死亡。但是有什么办法可以检查吗?我在下面写了一个简单的程序。有人能证明它几乎把理论放在一边吗?

class childre extends Thread
{   
    public void run()
    {   
        for( int i=0 ; i<10 ;i++)
        {
            System.out.println( " child " + i);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        }
    }
}

public class ChildThreadb4main
{

/**
 * @param args
 */
    public static void main(String[] args)
    {
    // TODO Auto-generated method stub

        System.out.println("main");

        childre c1 = new childre();

        c1.start();
        for(int i=0;i<5;i++)
        {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println( " child thread alive ? " + c1.isAlive());
    }
}

经过詹姆斯的建议。我尝试了以下程序。

public class MainChildDie {

    public static void main(String ar[]){

        final Thread mainThread = Thread.currentThread();
        System.out.println("main run ");

        new Thread(){

            public void run(){

                Thread childThread= Thread.currentThread();
                for(int i=0; i<10;i++){
                    System.out.println( "child"+i);

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("main alive  " + mainThread.isAlive());
            }
        }.start();      
    }
}

问题答案:

从http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html:

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

  1. 已调用类Runtime的退出方法,并且安全管理器已允许进行退出操作。

  2. 不是守护程序线程的所有线程都已死,要么通过从调用返回到run方法,要么抛出传播到run方法之外的异常。

在您的情况下,当主线程死亡时,JVM不会退出,因为您仍在运行所创建的线程,并且默认情况下它们是守护程序,因此:

当且仅当创建它的线程当前被标记为守护程序线程时,才将新创建的线程最初标记为守护程序线程。setDaemon方法可用于更改线程是否是守护程序。

引用:http
:
//docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#setDaemon(boolean)



 类似资料:
  • 问题内容: 主线程将在子线程完成执行之前退出? 我读了两篇文章 http://www.cs.mtu.edu/~shene/NSF-3/e-Book/FUNDAMENTALS/thread- management.html 在以上文章的“线程终止”段中,它用红色表示“如果父线程终止,则其所有子线程也终止。” http://www.roseindia.net/java/thread/overview-

  • 问题内容: 我使用pthread_create创建几个子线程。一次,主线程要杀死所有子线程,否则将出现段故障。我应该使用哪个功能来完成此操作?我从谷歌搜索答案,并得到了类似pthread_kill的功能。但是我不知道应该向子线程发送哪个信号来杀死它们。我的运行环境是RHEL 5.4,编程语言是C。 问题答案: 可以使用来“取消”线程。但是,这通常不是最佳做法,尽管在SEGFAULT这样的极端情况下

  • 本文向大家介绍Android主线程和子线程区别详解,包括了Android主线程和子线程区别详解的使用技巧和注意事项,需要的朋友参考一下 主线程和子线程的区别 每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。 线程唯一标示符:Thread.CurrentThread.ManagedThreadID; UI界面和Main函数均为主线程。 被Thread包含的“方法体”或者“委托”均为子线程。

  • 我试图理解Python线程的“守护进程”标志。这我知道 线程可以标记为“守护线程”。此标志的意义在于,当只剩下守护进程线程时,整个Python程序将退出。初始值从创建线程继承。 但在我的例子中,python程序在守护进程线程离开并且线程没有完成其工作之前退出。 主程序 第一个线程只写5000个第一个整数,而第二个线程不写任何数字

  • 问题内容: 是否可以在不设置/检查任何标志/信号灯/等的情况下终止正在运行的线程? 问题答案: 在Python和任何语言中,突然终止线程通常都是一种糟糕的模式。请考虑以下情况: 线程持有必须正确关闭的关键资源 该线程创建了其他几个必须同时终止的线程。 如果你负担得起的话(如果你要管理自己的线程),处理此问题的一种好方法是有一个标志,每个线程定期检查一次,以查看是否该退出。 例如: 在此代码中,你应

  • 主要内容:1 什么是Java线程死锁,2 Java线程死锁的例子1 什么是Java线程死锁 Java中的死锁是多线程的一部分。当线程正在等待由另一个线程获取的对象锁而第二个线程正在等待由第一个线程获取的对象锁时,可能会发生死锁。由于两个线程都在互相等待释放锁,因此这种情况称为死锁。 2 Java线程死锁的例子 输出结果为: