JAVA守护线程与非守护线程

什么是线程

线程是指进程中的一个执行流程,一个进程中可以运行多个线程。
Java有两种Thread:

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

什么是非守护线程(User Thread)

非守护线程包括常规的用户线程或诸如用于处理GUI事件的事件调度线程,Java虚拟机在它所有非守护线程已经离开后自动离开。

什么是守护线程(Daemon Thread)

定义详解

守护线程则是用来服务非守护(用户)线程的
比如Java的垃圾回收机制:GC线程。
如果没有其他的用户线程在运行,那么此时的GC线程就没有要服务的对象了,所以就没有必要继续执行下去,JVM(虚拟机)此时也就会退出了。

拓展

  • 一方面:操作系统里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制是构建在JVM的基础之上的,所以说Java平台会把操作系统的底层给屏蔽起来,让它可以在它自己的虚拟的平台里面构造出对 自己有利的机制。
  • 另一方面:语言或者说平台的设计者多多少少是受到Unix思想的影响,而守护线程机制又是针对像JVM这样的平台,于是才有了守护线程;
  • 守护线程一般在实际的使用中较少,但并非无用。
    举几个例子:JVM的垃圾回收、内存管理等线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等。

创建守护线程

setDaemon方法

调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。(守护线程与普通线程写法上基本没什么区别)

方法名称

public final void setDaemon( boolean on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。

参数

on :如果值为 true,则将该线程标记为守护线程。

抛出

IllegalThreadStateException - 如果该线程处于活动状态。
SecurityException - 如果当前线程无法修改该线程。

注意要点

  • thread.setDaemon(true)必须在thread.start()之前,否则会出现IllegalThreadStateException异常,提示该线程正在处于活动状态。如果线程是守护线程,则isDaemon方法返回true。
  • 在Daemon线程中产生的新线程也是Daemon的。
  • 不是所有的应用都可以分配给Daemon线程来进行服务。
    比如读写操作或者计算逻辑。因为在Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了。

代码示例

public  class Test {  
    public  static  void main(String[] args) {  
           Thread t1 =  new MyCommon();  
           Thread t2 =  new Thread(new MyDaemon());
           t2.setDaemon( true); //设置为守护线程  
           t2.start();  
           t1.start();  
   }  
}  

class MyCommon  extends Thread {  
    public  void run() {  
            for ( int i = 0; i < 5; i++) {  
                   System.out.println( "线程1第" + i +  "次执行!");  
                    try {  
                           Thread.sleep(7);  
                   }  catch (InterruptedException e) {  
                           e.printStackTrace();  
                   }  
           }  
   }  
}  

class MyDaemon  implements Runnable {  
    public  void run() {  
            for ( long i = 0; i < 9999999L; i++) {  
                   System.out.println( "守护线程第" + i +  "次执行!");  
                    try {  
                           Thread.sleep(7);  
                   }  catch (InterruptedException e) {  
                           e.printStackTrace();  
                   }  
           }  
   }  
} 

运行效果

在这里插入图片描述

从上面的运行效果可以看出:
前台线程是保证执行完毕的,后台线程还没有执行完毕就退出了。

守护线程与非守护线程的区别

User Thread线程和Daemon Thread守护线程唯一的区别之处就在虚拟机的离开:
当JVM中所有的线程都是守护线程的时候,JVM就可以退出了(如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了);如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)。

举个例子:
守护线程就像小区里的保安 ,里面各种住户(非守护线程),他们是可以同时干着各自的活儿,但是住户们要是都一个个被带走了,那么门口的保安也就没有存在的意义了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值