在java中创建守护线程的方法

  介绍

本篇文章为大家展示了在java中创建守护线程的方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

java线程分为两类分别为守护进程线程(守护线程)和用户线程(用户线程),在JVM启动时候会调主要用函数,主要函数所在的线程是一个用户线程,这个是我们可以看到的线程,其实JVM内部同时还启动了好多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别那?区别之一是当最后一个非守护线程结束时候,JVM会正常退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响JVM的退出。言外之意是只要有一个用户线程还没结束正常情况下JVM就不会退出。

创建守护线程的方法:

公共静态void main (String [] args) {
  
  线程daemonThread=新线程(新Runnable () {
  公共空间run () {
  
  }
  });//设置为守护线程
  daemonThread.setDaemon(真正的);
  daemonThread.start ();
  
  }
  

可知只需要设置线程的守护进程参数为真实即可。

下面通过例子来加深用户线程与守护线程的区别的理解,首先看下面代码:

公共静态void main (String [] args) {
  
  线程的线程=新线程(新Runnable () {
  公共空间run () {
  (,){}
  }
  });//启动子线
  thread.start ();
  
  System.out.print(“主线程是over");
  }

结果输出为:

霸趈ava中创建守护线程的方法”

如上代码在主要线程中创建了一个线程线程,螺纹线程里面是无限循环,运行代码从结果看主要线程已经运行结束了,那么JVM进行已经退出了?从IDE的输出结果右侧上的红色方块说明JVM进程并没有退出,另外
mac上执行ps电弧炉| grep java会输出结果,也可以证明这个结论。

这个结果说明了当父线程结束后,子线程还是可以继续存在的,也就是子线程的生命周期并不受父线程的影响。也说明了当用户线程还存在的情况下JVM进程并不会终止。那么我们把上面的螺纹线程设置为守护线程后在运行看看会有什么效果:

//设置为守护线程
  thread.setDaemon(真正的);//启动子线
  thread.start (); 

执行结果为:

霸趈ava中创建守护线程的方法"

如上在启动线程前设置线程为守护线程,从输出结果可知JVM进程已经终止了,执行ps电弧炉| grep java也看不到JVM进程了。这个例子里主要面函数是唯一的用户线程,螺纹线程是守护线程,当主要线程运行结束后,JVM发现当前已经没有用户线程了,就会终止JVM进程。

java中在主要线程运行结束后,JVM会自动启动一个叫做DestroyJavaVM线程,该线程会等待所有用户线程结束后终止JVM进程,下面通过简单的JVM代码来证明这个结论:

翻开JVM的代码,最终会调用到JavaMain这个c函数

 int JNICALL
  JavaMain (void * _args)
  {
  ...//执行Java中主要的函数
  (* env)→CallStaticVoidMethod (env, mainClass, mainID mainArgs);//主函数返回值
  ret=(* env)→ExceptionOccurred (env)==NULL, # 63;0:1;//等待所有非守护线程结束,然后销毁JVM进程
  离开();
  }

离开是c语言里面的一个宏定义,定义如下:

 # define() \离开
  做{\
  如果((* vm)→DetachCurrentThread (vm) !=JNI_OK) {\
  JLI_ReportErrorMessage (JVM_ERROR2);\
  ret=1;\
  }\
  如果(JNI_TRUE) {\
  (* vm)→DestroyJavaVM (vm);\
  返回受潮湿腐烂;\
  }\
  }而(JNI_FALSE) 

上述内容就是在java中创建守护线程的方法,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

在java中创建守护线程的方法