2019独角兽企业重金招聘Python工程师标准>>>

一、概述

当一个应用程序里没有其他的线程运行的时候,守护线程才运行;当守护线程是程序中唯一运行的线程时,守护线程执行结束后,JVM也就结束了这个程序。

基于以上特性,守护线程通常被用来作为同一程序中普通线程(也称之为用户线程)的服务提供者。它们通常是无限循环的,以等待服务请求或者执行线程的任务。它们不能做重要的工作,因为不可能知道守护线程什么时候能够获取 cpu 时钟,并且,在没有其他线程运行的时候,守护线程随时可能结束。典型的守护线程 Java 的垃圾回收器。

注意:

1、setDaemon() 方法只能在 start() 方法被调用之前设置;一旦线程开始运行,将不能再修改守护状态;

2、isDaemon() 方法被用来检查一个线程是否是守护线程,返回 true 表示守护线程,false 表示 这个线程是 用户线程;

二、实现

示例:  创建2个线程:一个是用户线程,它将事件写入到一个队列中;另外一个是守护线程,它将管理这个队列,如果生成的事件超过 10 秒钟,该事件就会被删除。

import java.util.Date;/*** 自定义事件*/
public class MyEvent {public static int globalI = 0;public int id;private String name;private Date createTime;public MyEvent(){modifyI();}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public String toString() {return "MyEvent [id=" + id + ", name=" + name + ", createTime="+ createTime + "]";}// 创建唯一编号的事件.public synchronized void modifyI(){id =  ++globalI;setId(id);}
}
import java.util.Date;
import java.util.Queue;
import java.util.concurrent.TimeUnit;/*** 向队列中放入待处理的事件*/
public class WriterTask implements Runnable{private Queue<MyEvent> queue;public WriterTask(Queue<MyEvent> queue){this.queue = queue;}public void run() {if(queue == null){System.out.println("添加操作-存放的 queue队列 未能初始化...");}for(int i=0;i<3;i++){MyEvent myEvent = new MyEvent();myEvent.setName("name_" +i);myEvent.setCreateTime(new Date());queue.add(myEvent);System.out.println(Thread.currentThread().getName() + "添加一个待处理事件:" + myEvent);try {TimeUnit.SECONDS.sleep(1); //休眠1s} catch (InterruptedException e) {e.printStackTrace();} System.out.println(Thread.currentThread().getName() + ":现有 queue中的事件数为:" + queue.size());}}
}
import java.util.Date;
import java.util.Queue;
import java.util.concurrent.TimeUnit;/****  清理 queue 队列中的 待处理事件.*/
public class CleanTesk extends Thread{private Queue<MyEvent> queue;public CleanTesk(Queue<MyEvent> queue){this.queue = queue;setDaemon(true); // 设置为 守护线程 - 此方法是 Thread类中的}public void run() {if (queue == null) {System.out.println("清理操作-存放的 queue队列 未能初始化...");}while(true){Date date = new Date();clean(date);}}// 清理操作public void clean(Date date){boolean isDelete = false;if(queue.size() == 0){System.out.println("清理操作-存放的 queue队列 没有待处理的事件...");try {TimeUnit.SECONDS.sleep(10); //10s} catch (InterruptedException e) {e.printStackTrace();}return;}MyEvent myEvent = queue.poll();if(myEvent == null){System.out.println("清理操作-获取待处理的事件无效...");return;}long difference = date.getTime() - myEvent.getCreateTime().getTime();if(difference >= 10000){ // 10sisDelete = true;}else{ // 时间不够,再放回去queue.add(myEvent);}if(isDelete){System.out.println(Thread.currentThread().getName()+"-清理了 一个待处理任务...myevent:"+myEvent);try {TimeUnit.SECONDS.sleep(1); //休息1s} catch (InterruptedException e) {e.printStackTrace();} System.out.println(Thread.currentThread().getName()+"-还剩的待处理任务...queue:"+queue.size());}}
}
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;/*** 守护线程测试*/
public class DaemonTest {public static void main(String[] args) {Queue<MyEvent> queue = new LinkedBlockingQueue<MyEvent>();WriterTask writerTask = new WriterTask(queue);for(int i=0;i<3;i++){Thread thread = new Thread(writerTask);thread.start();}CleanTesk cleanTesk = new CleanTesk(queue);Thread clearThread = new Thread(cleanTesk);clearThread.start();}
}
//console打印结果:
清理操作-存放的 queue队列 没有待处理的事件...
Thread-1添加一个待处理事件:MyEvent [id=1, name=name_0, createTime=Tue Sep 05 16:02:01 CST 2017]
Thread-0添加一个待处理事件:MyEvent [id=2, name=name_0, createTime=Tue Sep 05 16:02:01 CST 2017]
Thread-2添加一个待处理事件:MyEvent [id=3, name=name_0, createTime=Tue Sep 05 16:02:01 CST 2017]
Thread-0:现有 queue中的事件数为:3
Thread-2:现有 queue中的事件数为:3
Thread-0添加一个待处理事件:MyEvent [id=4, name=name_1, createTime=Tue Sep 05 16:02:02 CST 2017]
Thread-1:现有 queue中的事件数为:3
Thread-2添加一个待处理事件:MyEvent [id=5, name=name_1, createTime=Tue Sep 05 16:02:02 CST 2017]
Thread-1添加一个待处理事件:MyEvent [id=6, name=name_1, createTime=Tue Sep 05 16:02:02 CST 2017]
Thread-0:现有 queue中的事件数为:6
Thread-2:现有 queue中的事件数为:6
Thread-0添加一个待处理事件:MyEvent [id=7, name=name_2, createTime=Tue Sep 05 16:02:03 CST 2017]
Thread-2添加一个待处理事件:MyEvent [id=8, name=name_2, createTime=Tue Sep 05 16:02:03 CST 2017]
Thread-1:现有 queue中的事件数为:8
Thread-1添加一个待处理事件:MyEvent [id=9, name=name_2, createTime=Tue Sep 05 16:02:03 CST 2017]
Thread-0:现有 queue中的事件数为:9
Thread-1:现有 queue中的事件数为:9
Thread-2:现有 queue中的事件数为:9
Thread-4-清理了 一个待处理任务...myevent:MyEvent [id=1, name=name_0, createTime=Tue Sep 05 16:02:01 CST 2017]
Thread-4-还剩的待处理任务...queue:8
Thread-4-清理了 一个待处理任务...myevent:MyEvent [id=2, name=name_0, createTime=Tue Sep 05 16:02:01 CST 2017]
Thread-4-还剩的待处理任务...queue:7
Thread-4-清理了 一个待处理任务...myevent:MyEvent [id=3, name=name_0, createTime=Tue Sep 05 16:02:01 CST 2017]
Thread-4-还剩的待处理任务...queue:6
Thread-4-清理了 一个待处理任务...myevent:MyEvent [id=4, name=name_1, createTime=Tue Sep 05 16:02:02 CST 2017]
Thread-4-还剩的待处理任务...queue:5
Thread-4-清理了 一个待处理任务...myevent:MyEvent [id=5, name=name_1, createTime=Tue Sep 05 16:02:02 CST 2017]
Thread-4-还剩的待处理任务...queue:4
Thread-4-清理了 一个待处理任务...myevent:MyEvent [id=6, name=name_1, createTime=Tue Sep 05 16:02:02 CST 2017]
Thread-4-还剩的待处理任务...queue:3
Thread-4-清理了 一个待处理任务...myevent:MyEvent [id=7, name=name_2, createTime=Tue Sep 05 16:02:03 CST 2017]
Thread-4-还剩的待处理任务...queue:2
Thread-4-清理了 一个待处理任务...myevent:MyEvent [id=8, name=name_2, createTime=Tue Sep 05 16:02:03 CST 2017]
Thread-4-还剩的待处理任务...queue:1
Thread-4-清理了 一个待处理任务...myevent:MyEvent [id=9, name=name_2, createTime=Tue Sep 05 16:02:03 CST 2017]
Thread-4-还剩的待处理任务...queue:0
清理操作-存放的 queue队列 没有待处理的事件...

转载于:https://my.oschina.net/u/1387400/blog/1529428

Java 多线程 - 线程 - 守护线程相关推荐

  1. Java多线程之守护线程实战

    转载自 Java多线程之<<守护线程>>实战 定义 什么是守护线程?与守护线程相对应的就是用户线程,守护线程就是守护用户线程,当用户线程全部执行完结束之后,守护线程才会跟着结束 ...

  2. JAVA多线程:守护线程 setDaemon全方位剖析| 守护线程是线程吗 |thread.isAlive()反思(五)

    前言 本文目的,通过短小精悍的实例,让你在最短时间,全面揭晓 thread.setDaemon(true)守护线程的使用,及其使用场景.一看就懂,一学就会! 概述 守护线程的作用 用来让其(这里暂称之 ...

  3. Java多线程之守护线程

    一.说明 Java中的线程分为两类:一种是守护线程,一种是用户线程.平台我们经常用到的就是用户线程.用户线程和守护线程,从本质上来说并没有什么区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全 ...

  4. (转)Java中的守护线程

    Java的守护线程与非守护线程 守护线程与非守护线程 最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户线程和守护线程 所谓守护线程 ...

  5. Java中的守护线程和非守护线程(转载)

    <什么是守护线程,什么是非守护线程> Java有两种Thread:"守护线程Daemon"(守护线程)与"用户线程User"(非守护线程). 用户线 ...

  6. Java多线程系列--“JUC线程池”06之 Callable和Future

    转载自  Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...

  7. java守护线程与用户线程_详解Java线程-守护线程与用户线程

    干java 开发这么多年, 之前一直没留意java 进程还区分守护进程和用户进程.守护进程这个概念最早还是在linux系统中接触的,直到近期使用java开发心跳检测功能时,使用Timer时才发现原来j ...

  8. java setdaemon_java教程--守护线程setDaemon

    守护线程setDaemon 守护线程: 为用户线程进行服务的线程.当所有的用户线程都执行结束以后无论守护线程的线程体是否执行完,守护线程都会结束 设置守护线程 void (boolean on)将该线 ...

  9. python—多线程之守护线程

    一.守护线程定义: setDaemon: 将线程声明为守护线程,必须在start()方法调用之前设置,如果不设置为守护线程程序会被无限挂起.这个方法基本和join是相反的.当我们在程序运行中,执行一个 ...

  10. 线程 守护线程 递归锁

    ------------------------------方法不对,功力全废;做事讲方法,做人讲原则. # # ------------------------------------------- ...

最新文章

  1. 【linux】ubuntu14.04升级dbus到1.13.8,杯具了,无法进入桌面
  2. window下从硬盘安装ubuntu双系统
  3. tomcat常用的优化和配置
  4. Quartz分布式实现
  5. Ipad 日程管理APP使用心得
  6. 二叉树的深度优先遍历原理及python实现
  7. Android Studio导入包
  8. python中集合运算_python集合的运算
  9. Coding List
  10. php项目推荐,php教程推荐:最值得推荐的10个php教程
  11. 个人开发者做一款Android App,android如何开发一款赚钱app
  12. 「AR裸眼插画」零基础入门级教程来啦
  13. Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇
  14. 微信营销诀窍:有朋自各方来
  15. 翻译程序、汇编程序、编译程序、解释程序的区别与联系
  16. python实现的电影票房数据可视化
  17. 基于粒子群算法的组卷系统的研究与实现
  18. WPF--Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
  19. 什么软件可以将win窗口进行置顶_【玩转YOGA】第四期:像平板一样使用平板——触屏手势软件GestureSign...
  20. CSS外部字体引入方式

热门文章

  1. 大快HanLP自然语言处理技术介绍
  2. Material Theme
  3. 《从问题到程序:用Python学编程和计算》——2.4 字符串
  4. Oracle脚本(二)
  5. C++指针探讨 (二) 函数指针
  6. Android中从源码分析关于AsyncTask的使用
  7. Ext4中获取下拉框的值
  8. nodejs+socket.io即时聊天实例
  9. scrollview 中用listview的方法
  10. B - Cube HDU - 1220 (数学计数)