java的守护进程与非守护进程区别

 在Java的线程机制中,有两类线程: 

  • User Thread(用户线程)
  • Daemon Thread(守护线程) 。

  Daemon Thread的作用是为其他线程的运行提供服务,比如说GC线程。其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开时候:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了。只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。守护线程最典型的应用就是 GC (垃圾回收器)。

    守护线程并非只有虚拟机内部可以提供,用户也可以自行的设定守护线程,可以通过Thread的setDaemon方法来设置,这个值的默认值是false,即默认是用户线程

  1. thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
  2. 在Daemon线程中产生的新线程也是Daemon的。  (这一点又是与守护线程有着本质的区别了:守护进程fork()出来的子进程不再是守护进程,尽管它把父进程的进程相关信息复制过去了,但是子进程的进程的父进程不是init进程,所谓的守护进程本质上说就是“父进程挂掉,init收养,然后文件0,1,2都是/dev/null,当前目录到/”)
  3. 不是所有的应用都可以分配给Daemon线程来进行服务,比如读写操作或者计算逻辑。因为在Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了。
class TestRunnable implements Runnable{  

    public void run(){  

               try{  

                  Thread.sleep(1000);//守护线程阻塞1秒后运行 
                  System.out.println("this thread is running"); 
                catch(IOException e){  

                    e.printStackTrace();  

               }  
               
           }  


}  

public class TestDemo{  

    public static void main(String[] args) throws InterruptedException  

    {  
        Runnable tr=new TestRunnable();  
        Thread thread=new Thread(tr);  
        thread.setDaemon(true); //设置守护线程  
        thread.start(); //开始执行分进程  
        System.out.println("main thread is finished");
        
    }  
}  

运行结果:只输出了“main thread is finished” 因为设置了thread.setDaemon(true); 当没有正在执行的用户线程的时候,守护线程也会结束。

如果把thread.setDaemon(true); 注释掉,会同时输出:"main thread is finished"和"this thread is running"

 

转载于:https://my.oschina.net/u/3242075/blog/3042068

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值