Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程终止顺序_Java_Multithreading - Fatal编程技术网

Java 线程终止顺序

Java 线程终止顺序,java,multithreading,Java,Multithreading,当我在java中学习多线程时,我知道线程没有执行顺序。 据我所知,以下陈述是否属实? 用户线程(不是守护进程线程)应该在主线程终止之前终止。 我读过类似的链接: 我有一个程序要去集中注意力,请纠正我 class ThreadDemo { public static void main(String args[]) { Thread t = new Thread(new Runnable(){ @Override

当我在java中学习多线程时,我知道线程没有执行顺序。 据我所知,以下陈述是否属实?
用户线程(不是守护进程线程)应该在主线程终止之前终止。

我读过类似的链接:

我有一个程序要去集中注意力,请纠正我

class ThreadDemo {  
  public static void main(String args[]) {      
    Thread t = new Thread(new Runnable(){  
            @Override  
            public void run() {  
                System.out.println("Within 'Child Thread' @ "+System.currentTimeMillis());                  
            }         
    }, "Child Thread");   

    //t.setDaemon(false);  
    t.start();  
    System.out.println(Thread.currentThread()+" thread is alive:"+Thread.currentThread().isAlive());  
    System.out.println(t+" thread is alive:"+t.isAlive());  

    System.out.println("'Main' thread exiting @ "+System.currentTimeMillis());     
  }  
}
在我的系统上,此程序的大多数输出是

“主”线程正在退出@1406971862950
在“子线程”内@1406971862952

这是否意味着主线程先于子线程退出?如果是,那么为什么会发生这种情况?

没错。当您执行程序时,将创建一个执行
main方法的
主线程
。因为您正在main中创建另一个线程,所以创建的线程和主线程都将并行执行,而不考虑彼此

但是,如果您需要创建的线程完成执行,而不是主线程完成执行,请在启动线程后添加followind代码

t.join(); 

这将迫使主线程停止,直到创建的线程完成执行。

守护进程线程是JVM在需要时自动拉入的线程。垃圾收集器是其中之一。 主线程由用户拉动。所以它是一个非守护进程线程


只有当所有非守护进程线程完成执行时,JVM才会关闭。它不会等待守护进程线程完成。

是什么让您认为“用户线程”需要首先终止,或者它将在您的代码中首先终止?在询问之前您是否阅读了此内容?可能重复的是,我已经浏览了几乎所有可能的链接。但正如大多数书中所写的,主线程或守护进程线程在末尾终止。那个么为什么这个子线程最终会终止,即在主线程之前?“[非守护线程]应该在主线程终止之前终止。”不正确!事实是这样的:JVM将杀死所有守护进程线程(如果有),然后在没有非守护进程线程时关闭。主线程是一个非守护进程线程,不调用setDaemon(true)就启动()的任何线程也是如此。如果main()线程创建其他线程,然后退出,那么这没有什么错。只要至少有一个其他(非守护进程)线程仍在运行,程序就会继续运行。谢谢,我接受,但如果我不使用
t.join()不应该在
'Child thread'
之前终止
'main'
线程吗?无法预测线程的执行。因此,没有保证创建的线程会在主线程之前完成。好的@Darshan,我知道在Java中,由于
'main'
线程不是
守护进程线程,而是非守护进程或用户线程。因此,无法预测它相对于其他竞争线程的执行情况。