Java中Main函数探讨

摘要:
在看到上一章中的Main线程后,我不禁要问,Main函数不是完成了任务并结束了任务吗?让我们深入虚拟机:使用虚拟机命令:C:ProgramFilesJavajdk1.8.0_211injvisualvm查看他的线程:结果是,我们的JAVA程序在启动主函数后,执行了他的任务,并创建了一个新线程,但这个线程仍在执行,而不是死,我们所有的JAVA程序仍在运行。但是在Java程序中,如果有非守护进程线程仍在执行过程中,那么我们的程序仍在执行中。

  上一章看到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的时候,这个按钮都是黑色的把。

Java中Main函数探讨第1张

第二种方式:  把线程打开  ,取消注释14行代码。

我们可以看到按钮的对比:

Java中Main函数探讨第2张

这是为什么呢?  我们深入虚拟机中探讨一下:

用虚拟机指令:  C:Program FilesJavajdk1.8.0_211injvisualvm  查看一下他的线程:

Java中Main函数探讨第3张

 原来是:我们的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程序中,如果还有非守护线程还在执行过程中,我们的程序就依然在执行中。

免责声明:文章转载自《Java中Main函数探讨》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python之路用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH 和 Log下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

深入单例模式

单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好、用对单例模式,还真得费一番脑筋。本文对Java中常见的单例模式写法做了一个总结,如有错漏之处,恳请读者指正。 饿汉法 顾名思义,饿汉法就是在第一次引用该类的时候就创建对象实例,而不管实际是否需要创建。代码如下: public class Singleton { private...

synchronized同步代码块锁释放

今天发现自己写的线上程序出现数据库不能同步的问题,查看日志已经停止记录,随后使用jstack查看线程的运行状况,发现有个同步线程锁住了。 以下是jstack -l 637  问题线程的内容。 "schedulerJob-t-291" #314 daemon prio=5 os_prio=0 tid=0x00007f7d64844800 nid=0x3d5...

web 服务的基础介绍

1>web 服务的访问流程          1.电脑浏览器网页上输入请求的地址          2.服务器接收到请求          3.服务器响应请求          4.将响应的数据返回给客户端 2>  apache 的三种工作模型(面试)               select ;work;event           2...

ManualResetEvent 与 AutoResetEvent 的理解和使用

在多线程开发中,时常用到ManualResetEvent 与AutoResetEvent 。 它们如同道路交通中的信号灯。两者之间有什么区别呢? 共同点: 均继承EventWaitHandle 接口,因此,均具有以下功能: Reset() //红灯 Set() //绿灯 WaitOne() // 等待信号 ManualResetEvent mre = ne...

ios 多线程

转自:http://www.maxiaoguo.com/clothes/254.html 多线程包含:GCD  NSOperation   NSOperation是在GCD语言的基础上开发的,GCD类C语言, NSOperation OC语法 GCD: 名词解释  并行 dispatch_queue_t q = dispatch_queue_crea...

Delphi线程基础知识

参考http://blog.chinaunix.net/uid-10535208-id-2949323.html 一、概述 Delphi提供了好几种对象以方便进行多线程编程。多线程应用程序有以下几方面的功能: 1.避免性能瓶颈:单线程应用程序在进行比较慢的操作如磁盘读写的时候,CPU必须停下来等待,直到该操作执行完毕。而多线程应用程序在进行比较慢的操作如磁...