任何线程都可以设置成为守护线程或用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。
守护线程,也可称为服务线程,当程序中没有可服务的线程时会自动离开。因此,守护线程的优先级比较低,用于为其他的线程等提供服务。Java中最典型的守护线程就是垃圾回收线程。当我们的应中用没有任何常规线程运行时,就不会产生垃圾了,垃圾回收线程就无服务对象了,就会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。那Java的守护线程是什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。
守护线程和用户线程的没啥本质的区别:唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。
将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意一下几点:
(1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
(2) 在Daemon线程中产生的新线程也是Daemon的。
(3) 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。
守护线程是线程中当之无愧的守护者,只有当最后一个非守护线程结束时,守护线程才停止工作。是不是觉得守护线程很有意思呢,可以在动力节点在线查阅到更多有关守护线程的知识,学习更多有趣的Java知识。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54