java线程执行完后自己结束吗

Python029

java线程执行完后自己结束吗,第1张

其实最佳答案的说法是有问题的,如果题主指的结束,是指方法块语句的执行结束的话,热心网友的说法是对的。但是对于线程本身,所有线程(包括主线程)在启动后都被CPU参照优先级交替调用,运行的顺序是无法预测的,但最后结束的一定是主线程。网上有部分说法,展示的代码运行结果,“主线程先于其他线程结束,并不影响其他线程的运行”只有后半部分是对的。因为方法体(不管是自定义线程的run()还是主线程的main())中全部语句的执行完毕不代表所在线程的结束,可以用activeCount()返回当前运行的总线程数来验证这一点。另外,如果将自定义的线程对象设定为守护线程(setDeamon()),也可以很清楚看到即便main()方法中最后一句输出语句执行完毕,控制台仍会根据该自定义线程run()方法体的内容继续输出,这证明主线程还没结束——因为当线程组中只剩下守护线程时,JVM虚拟机会自动退出,如果主线程已经结束,唯一活动的线程在被设置成守护线程的情况下,程序会直接结束运行,不可能继续输出。

你应该换成main函数运行,abcd就一定会打印出来了

问题并不是出在主线程和子线程身上,事实上Java似乎也没有严格主线程和子线程的概念,取而代之的是普通线程和后台线程

但是这里你采用@Test来运行代码,而@Test是JUnit测试框架使用的注解,JUnit在进行单元测试的时候,如果被@Test注释的方法执行完成,那么内部开启的线程也会被强制退出,退出是测试框架进行的操作

这和Java承诺的普通线程不退出程序就不结束是不相符的,如果书上告诉你会输出两个但是你执行了只输出了一个那么很可能就是这里出了问题

而通过main函数则没有框架干预,根据Java的规则只要有普通线程没有退出,程序就不会完全退出(System.exit强制自杀除外),那么除非创建的线程被设置成了后台线程(或者叫守护线程,daemon),那么才会在主线程退出时自动关闭这些后台线程,就是你遇到的偶尔可以输出abcd偶尔不行的效果,否则一定会abcd和efgh两个都输出,只不过输出顺序可能不一致

新建一个线程后,启动该线程.可以是多个.

而此时的Main()函数就是主线程,其他线程与他同时进行.Main()里的语句执行完毕后就自然结束了(即主线程结束).无须做过多处理.