Java 线程终止顺序
当我在java中学习多线程时,我知道线程没有执行顺序。 据我所知,以下陈述是否属实?Java 线程终止顺序,java,multithreading,Java,Multithreading,当我在java中学习多线程时,我知道线程没有执行顺序。 据我所知,以下陈述是否属实? 用户线程(不是守护进程线程)应该在主线程终止之前终止。 我读过类似的链接: 我有一个程序要去集中注意力,请纠正我 class ThreadDemo { public static void main(String args[]) { Thread t = new Thread(new Runnable(){ @Override
用户线程(不是守护进程线程)应该在主线程终止之前终止。 我读过类似的链接:
我有一个程序要去集中注意力,请纠正我
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'
线程不是守护进程线程,而是非守护进程或用户线程。因此,无法预测它相对于其他竞争线程的执行情况。