`
endual
  • 浏览: 3502988 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java多线程编程系列-基础3-线程Daemon线程的理解

    博客分类:
  • java
 
阅读更多

java多线程中,有一种特殊的线程叫做守护线程,关键词是Deamon。

我们在平时的书上都有介绍过,但是很少有用代码来讲的。我们往往记住的是:

守护线程是一般是用于辅助的,提供一些后台处理的理想方法,他们只是在支持其他非守护线程的时候才是需要的。

 

理解的深一点的,可以这么讲,守护线程的生命是和mian关联在一起的,如果man方法用完了,主线程死掉了,那么

守护线程就会陪着去送命,也会死掉的。而如果不是守护线程的话是不会这样的。

下面我们来看下代码的吧:

 

首先创建一个线程.守护线程并不是在创建线程的时候指定的,这其实和设定线程的名字是一样的,要再线程开始的去指定的。

 

 

package endual;

public class Daemon extends Thread{

	public void run () {
		
		System.out.println("entering run()");
		
		try {
			System.out.println("in run() - currentThread()=" + 
					Thread.currentThread());
			
			while (true) {
				try {
					Thread.sleep(500) ;
				} catch (Exception e) {
					// TODO: handle exception
				}
				System.out.println("in run()--  woke up again");
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			System.out.println("leanving run()");
		}
		
	}
	
}

 

 

main的测试类(这个时候,不是守护线程)

package endual;

public class MainApp {

    /**
     * 标记为守护的线程将以全新的方式终止。守护线程用于后台的支持任务,而且仅仅在普通的,非守护线程
     * 仍然需要运行的时候才需要的。当VM检测仅仅剩下一个守护线程的时候,就会退出的。如果非守护线程仍然还
     * 存活着,VM就不会退出的,守护线程提供了一种管理某些后台处理的理想的方法,他们只是在支持其他非守护线程
     * 时才需要的
     * @param args
     */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("enter main()");
		Daemon de = new Daemon() ;
		//de.setDaemon(true) ; //设置成为了daemon线程,设置成为守护线程
		de.start() ;
		
		try {
			Thread.sleep(3000) ;
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		System.out.println("leaving main(0");
	}

}

 

结果是:

enter main()
entering run()
in run() - currentThread()=Thread[Thread-0,5,main]
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
leaving main(0
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
 

当main方法用完以后也就是主线线程死掉了以后,这个线程还是在运行中的。

-----------------------------------------------------------------------------------设定守护线程

 

而如果将线程设定为守护线程的话,情况就不一样的

 

package endual;

public class MainApp {

    /**
     * 标记为守护的线程将以全新的方式终止。守护线程用于后台的支持任务,而且仅仅在普通的,非守护线程
     * 仍然需要运行的时候才需要的。当VM检测仅仅剩下一个守护线程的时候,就会退出的。如果非守护线程仍然还
     * 存活着,VM就不会退出的,守护线程提供了一种管理某些后台处理的理想的方法,他们只是在支持其他非守护线程
     * 时才需要的
     * @param args
     */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("enter main()");
		Daemon de = new Daemon() ;
		de.setDaemon(true) ; //设置成为了daemon线程,设置成为守护线程
		de.start() ;
		
		try {
			Thread.sleep(3000) ;
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		System.out.println("leaving main(0");
	}

}
 

测试的结果是

 

 

enter main()
entering run()
in run() - currentThread()=Thread[Thread-0,5,main]
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
in run()--  woke up again
leaving main(0
in run()--  woke up again

 结果就是当main方法死掉以后,守护线程马上就死掉了的

 

分享到:
评论
1 楼 endual 2012-02-21  
守护线程可能非常有用,但是要小心确保其他线程所有的非守护线程消亡时,不会由于他的终止来带来危害

相关推荐

    【IT十八掌徐培成】Java基础第08天-02.多线程-join-daemon-同步.zip

    【IT十八掌徐培成】Java基础第08天-02.多线程-join-daemon-同步.zip

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段12讲、Daemon线程的创建以及使用场景分析.mp4 │ 高并发编程第一阶段13讲、线程ID,优先级讲解.mp4 │ 高并发编程第一阶段14讲、Thread的join方法详细介绍,结合一个典型案例.mp4 │ 高...

    Java多线程守护线程

     在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)  作用  Daemon的作用是为其他线程的运行提供便利服务,守护线程典型的应用是 GC (垃圾回收器),它是一个很称职的守护者。  区别  ...

    java 编程入门思考

    14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable ...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段12讲、Daemon线程的创建以及使用场景分析.mp4 │ 高并发编程第一阶段13讲、线程ID,优先级讲解.mp4 │ 高并发编程第一阶段14讲、Thread的join方法详细介绍,结合一个典型案例.mp4 │ 高...

    java程序设计于开发 第七讲 多线程

    多线程基本概念 创建线程的方式 线程的生命周期及控制 线程的优先级及调度 多线程的互斥与同步 守护线程 (Daemon) 线程组 (ThreadGroup)

    python多线程DAY04.txt

    解决了多个进程或者线程对共享资源的争夺 Event e.set e.clear e.wait Lock lock.acquire() lock.release() 4. 什么是线程 threading Thread() t.start() t.join() t.name t.getName t.setName t.daemon...

    Thinking in Java 中文第四版+习题答案

    14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾 14.5.1 过多的线程 14.6 ...

    step-daemon:步进式-用于3D打印的外部计划器和步进器

    步骤守护程序 Step Daemon(步进式)是用于3d打印机的外部计划程序,该计划... 多线程管道。 双立方床水准仪具有每步精度(相对于每行)。 兼容OctoPrint。 与对Marlin的直接步进块支持一起开发。 适用于Linux(包

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable ...

    Java初学者入门教学

    14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable ...

    Java JDK实例宝典

    第1章 Java基础 1.1 转换基本数据类型 1.2 Java的运算符 1.3 控制程序的流程 1.4 计算阶乘 1.5 实现命令行程序 第2章 Java面向对象程序设计 2. 1 复数类 2. 2 equals.chashCode...

    java联想(中文)

    14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable ...

    快速解决pyqt5窗体关闭后子线程不同时退出的问题

    用pyqt5设计了一个主窗体,在窗体运行时需要把一个无限循环放在一个线程去工作。运行后,发现通过鼠标按主窗体的关闭按键关闭主创体后,线程不会自动终止,依然在运行。尽管对我的使用场景来说,这不是问题,因为...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable ...

    java jdk实列宝典 光盘源代码

    一个支持多线程的服务器框架,GeneralServer.java; 代理服务器,ProxyServer.java; telnet客户端,访问系统的telnet服务实质上是与telnet服务建立socket连接,默认的telnet服务的端口是23,TelnetClient.java; ...

    JAVA_Thinking in Java

    14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable ...

    Thinking in Java简体中文(全)

    14.1.5 Daemon线程 14.2 共享有限的资源 14.2.1 资源访问的错误方法 14.2.2 Java如何共享资源 14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable ...

Global site tag (gtag.js) - Google Analytics