Java 守护线程(Daemon) 例子

Java  守护线程(Daemon) 示例

本文由 TonySpark 翻译自 Javarevisited转载请参见文章末尾的要求。

当我们在Java中创建一个线程,缺省状态下它是一个User线程,如果该线程运行,JVM不会终结该程序。当一个线被标记为守护线程,JVM不会等待其结束,只要所有用户(User)线程都结束,JVM将终结程序及相关联的守护线程。

Java中可以用 Thread.setDaemon(true) 来创建一个守护线程。咱们看一个Java中有关守护线程的例子。


 1 public class JavaDaemonThread {
2
3 public static void main(String[] args) throws InterruptedException {
4 Thread dt = new Thread(new DaemonThread(), "dt");
5 dt.setDaemon(true);//译者注:此次将User线程变为Daemon线程
6 dt.start();
7 //continue program
8 Thread.sleep(30000);
9 System.out.println("Finishing program");
10 }
11
12 }
13
14 class DaemonThread implements Runnable{//译者注:此类虽类名是为Daemon线程,其实为User线程
15
16 @Override
17 public void run() {
18 while(true){
19 processSomething();
20 }
21 }
22
23 private void processSomething() {
24 try {
25 System.out.println("Processing daemon thread");
26 Thread.sleep(5000);
27 } catch (InterruptedException e) {
28 e.printStackTrace();
29 }
30 }
31
32 }

当你运行该程序,JVM 在main()方法中先创建一个用户线程,再创建一个守护线程。当main()方法结束后,程序终结,同时JVM也关闭守护线程。

下面就是上述程序执行的结果:


1 Processing daemon thread
2 Processing daemon thread
3 Processing daemon thread
4 Processing daemon thread
5 Processing daemon thread
6 Processing daemon thread
7 Finishing program

如果我们不将一个线程以守护线程方式来运行,即使主线程已经执行完毕,程序也永远不会结束,可以尝试把上述将线程设为守护线程的那句注释掉,重新运行看看结果:

通常我们创建一个守护线程,对于一个系统来说在功能上不是主要的。例如抓取系统资源明细和运行状态的日志线程或者监控线程。

原文链接: Javarevisited 翻译: TonySpark
译文链接: http://www.cnblogs.com/tonyspark/p/3720640.html

转载请保留原文出处、译者和译文链接。]

时间: 2024-10-03 21:41:15

Java 守护线程(Daemon) 例子的相关文章

JAVA - 守护线程(Daemon Thread)

转载自:http://www.cnblogs.com/luochengor/archive/2011/08/11/2134818.html 在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程.反过来说,只要任何非守护线

JAVA并发编程——守护线程(Daemon Thread)

在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程.反过来说,只要任何非守护线程还在运行,程序就不会终止. 用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下

java 守护线程整理

java中finally语句不走的可能存在system.exit(0)与守护线程 线程sleep采用TimeUnit类 设定线程的名字thread.getcurrentThread().setName() 设定守护线程thread.getcurrentThread().setDaemon(true) http://www.cnblogs.com/diyingyun/archive/2011/12/04/2275268.html 守护线程在没有用户线程可服务时自动离开,在 Java中比较特殊的线程

守护线程(Daemon Thread)

在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程.反过来说,只要任何非守护线程还在运行,程序就不会终止. 用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守

Java守护线程概述

Java的线程分为两种:User Thread(用户线程).DaemonThread(守护线程). 只要当前JVM实例中尚存任何一个非守护线程没有结束,守护线程就全部工作:只有当最后一个非守护线程结束是,守护线程随着JVM一同结束工作,Daemon作用是为其他线程提供便利服务,守护线程最典型的应用就是GC(垃圾回收器),他就是一个很称职的守护者. User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thre

白话JAVA守护线程

OneCoder(苦逼Coder)原创,转载请务必注明出处: http://www.coderli.com/archives/daemon-thread-plain-words/ 关于“白话”:偶然想到的词,也许有一天能成为一个系列.目的就是用简洁,明快的语言来告诉您,我所知道的一切. Java中的线程分两类,用户线程和守护线程. Thread commonThread = new Thread("Common Thread"); 这样就是用户线程. Thread daemonThre

JAVA守护线程与用户线程的区别

public class DaemonTest { public static void main(String[] args) { new WorkerThread().start(); try { Thread.sleep(7500); } catch (InterruptedException e) {} System.out.println("Main Thread ending") ; } } class WorkerThread extends Thread { publi

android开发之线程(守护线程daemon和User Thread)

Java将线程分为User线程和Daemon线程两种.其中Daemon thread即守护线程.1.所谓守护线程就是运行在程序后台的线程,程序的主线程Main(比方java程序一开始启动时创建的那个线程)不会是守护线程 2.Daemon thread在Java里面的定义是,如果虚拟机中只有Daemon thread 在运行,则虚拟机退出.   通常Daemon线程用来为User线程提供某些服务.程序的main()方法线程是一个User进程,User进程创建的进程为User进程.当所有的User线

转:JAVA守护线程

原文地址:https://www.cnblogs.com/wxgblogs/p/5417503.html 详细内容看原文~  ,写的挺好的 在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) .用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作:只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作.Daemon的作用是为其他线程的运行提供便利服