Java中Main函数探讨
上一章看到Main线程后,不禁疑问,Main函数不是执行完他的任务就结束他的使命了嘛?
然后发现,事情没有那么简单。
案例1:
1 public class Main { 2 3 public static void main(String[] args) { 4 Thread t1= new Thread(() -> { 5 while(true){ 6 try { 7 Thread.sleep(1000); 8 } catch (InterruptedException e) { 9 e.printStackTrace(); 10 } 11 } 12 }); 13 t1.setName("Hello WOrld Thread"); 14 //t1.start(); 15 System.out.println("Hello World!"); 16 17 } 18 }
执行完之后,线程就死了。 有没有发现你的这个按钮是黑色的? 相信我们在初始学习Java的时候,这个按钮都是黑色的把。
第二种方式: 把线程打开 ,取消注释14行代码。
我们可以看到按钮的对比:
这是为什么呢? 我们深入虚拟机中探讨一下:
用虚拟机指令: C:\Program Files\Java\jdk1.8.0_211\bin\jvisualvm 查看一下他的线程:
原来是:我们的JAVA程序,启动main函数之后,执行完他的任务,new了一个新的线程,但是这个线程还在不断执行中,并没有死亡,所有我们的Java程序还在运行中。
如果: 我们把Hello WOrld Thread 改为守护线程:
t1.setName("Hello WOrld Thread"); t1.setDaemon(true); t1.start(); System.out.println("Hello World!");
再运行一下程序,我们发现他按钮变成灰色的了。再进入jvisualvm 查看一下线程情况。
好的,我们已经找不到Main这个进程了。
总结:main函数执行完他的任务之后,就已经死亡掉了。 但是Java程序中,如果还有非守护线程还在执行过程中,我们的程序就依然在执行中。