守护进程,顾名思义就是默默在后台运行的进程,当JVM上没有其他进程运行时运行的进程,最典型的一个列子就是

JVM自带的垃圾清理机,他就是在其他程序不运行的时候占用CPU来进行清理内存垃圾,因此他具有很强的不确定性,

因为你不知道啥时候他就会运行,也不知道啥时候他不会运行,因此适合做一个不太重要的清理工作或者服务器上的监

听工作。

下面我们使用JVM的daemon来写一个小例子,实现的效果如下

In this recipe, we will learn how to create a daemon thread developing an example with two threads; one user thread that writes events on a queue and a daemon one that cleans that queue, removing the events which were generated more than 10 seconds ago。

这里的队列是一个双向列表。代码如下

package com.bird.concursey;import java.util.Date;
import java.util.Deque;
import java.util.concurrent.TimeUnit;public class WriterTask implements Runnable {public WriterTask(Deque<Event> deque) {this.deque = deque;}// 这个为双向队列private Deque<Event> deque;public Deque<Event> getDeque() {return deque;}public void setDeque(Deque<Event> deque) {this.deque = deque;}@Overridepublic void run() {for(int i = 0; i < 100; i++) {Event event = new Event();event.setDate(new Date());event.setEvent("The Thread " + Thread.currentThread().getId() + " has generated a event");deque.addFirst(event);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}}
package com.bird.concursey;import java.util.Date;
import java.util.Deque;public class CleanerTask extends Thread {private Deque<Event> deque;public CleanerTask(Deque<Event> deque) {this.deque = deque;//设置为守护进程setDaemon(true);}@Overridepublic void run() {while(true) {Date date = new Date();clean(date);}}private void clean(Date date) {long difference = 0;boolean delete = false;if(deque.size() == 0) {return;}do {Event e = deque.getLast();difference = date.getTime() - e.getDate().getTime();if(difference > 10000) {System.out.println("cleaner " + e.getEvent());deque.removeLast();delete = true;}}while(difference > 10000);if(delete) {System.out.println("cleaner : the size of the deque " + deque.size());}}public Deque<Event> getDeque() {return deque;}public void setDeque(Deque<Event> deque) {this.deque = deque;}}
package com.bird.concursey;import java.util.ArrayDeque;
import java.util.Date;
import java.util.Deque;public class Event {private Date date;private String event;public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public String getEvent() {return event;}public void setEvent(String event) {this.event = event;}public static void main(String[] args) {Deque<Event> deque = new ArrayDeque<Event>();WriterTask writer = new WriterTask(deque);for(int i = 0; i < 3; i++) {Thread thread = new Thread(writer);thread.start();}CleanerTask cleaner = new CleanerTask(deque);cleaner.start();}
}

运行结果就是

cleaner The Thread 12 has generated a event
cleaner The Thread 11 has generated a event
cleaner : the size of the deque 27
cleaner The Thread 13 has generated a event
cleaner : the size of the deque 26
cleaner The Thread 13 has generated a event
cleaner The Thread 12 has generated a event
cleaner The Thread 11 has generated a event
cleaner : the size of the deque 26
cleaner The Thread 12 has generated a e

这个队列总是维护在25-30左右,因为上来三个线程创建了30个事件,然后等创建事件的线程休息的时候,daemon线

程就会占用CPU time 来运行清理建立好的事件,这样就会让队列一直维护在25-30左右,最关键的一句

//设置为守护进程 setDaemon(true);必须在start之前设置,因为线程一旦运行起来了就不能更改他的状态,这样就开

始了监控的状态,守护进程就OK了

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

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

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

  2. Python多线程之守护进程

    Python多线程之守护进程 让主进程不在等待子进程,只要主进程结束,不管子进程是否执行完成,子进程都要随着主进程结束而中止 # coding:utf-8 # 作者 : 王 # 职业 : 嘉心糖 # ...

  3. python守护多线程_Python守护进程(多线程开发)入门实例

    这篇文章主要为大家详细介绍了Python守护进程(多线程开发)入门实例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! ...

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

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

  5. Java多线程1:进程与线程

    进程和线程 讲线程和进程前,先讲下同步(Synchronous).异步(Asynchronous).并发(Concurrency).并行(Parallelism). 同步(Synchronous)和异 ...

  6. Java多线程1:进程与线程概述

    进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...

  7. Java多线程之一:进程与线程

    进程与线程 进程 进程是系统中正在运行的一个程序,程序一旦运行就是进程,也可以说进程是受操作系统管理的基本运行单元进. 平时我们打开的任务管理器中看到进程就是启动的程序,如浏览器的打开等等 线程 进程 ...

  8. Java 多线程 - 线程 - 守护线程

    2019独角兽企业重金招聘Python工程师标准>>> 一.概述 当一个应用程序里没有其他的线程运行的时候,守护线程才运行:当守护线程是程序中唯一运行的线程时,守护线程执行结束后,J ...

  9. Java多线程之守护线程

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

最新文章

  1. Deploy Office Communications Server 2007R2 Group Chat Server(二)
  2. 《Windows网络与通信程序设计(第3版)》——1.4 网络应用程序设计基础
  3. 数据库将某个字段由可为空改为非空
  4. linuxliveu盘怎么用_U盘数据如何恢复?U盘打不开怎么办?
  5. zookeeper 源码阅读(1)
  6. Md5 Md5实现原理
  7. r语言中1c0怎么表示什么,r语言表示或者用什么符号?
  8. Django 如何展示Media底下的图片
  9. html 再按一次退出,【劲爆、独家】拦截再按一次退出应用,改成单击back隐藏到后台...
  10. 【TSP】基于matlab遗传和模拟退火算法求解旅行商问题【含Matlab源码 696期】
  11. remoting的Client如果访问IIS宿主server端要通过Firewall怎么办?
  12. 群晖 6.1 重置 mysql_群晖 “还原”/系统可恢复”无限循环终极解决
  13. RBF神经网络和拟合实例
  14. 学习哪一款EDA软件画PCB电路板比较好?AD、PADS与Allegro的比较
  15. 【硬件】PIC32单片机烧写器以及线序说明
  16. 早悟兰因(兰因絮果)
  17. 戴尔豪斯大学计算机科学学费,加拿大研究生申请案例:渥太华大学录取:电子商业科技申请案例【2013】...
  18. Android中app卡顿原因分析示例
  19. 设计模式之禅【访问者模式】
  20. 华南理工网络教育计算机平时作业,2017年华南理工大学网络教育计算机应用基础平时作业...

热门文章

  1. iPad2 4.3.3完美越狱教程
  2. 腾讯AI开放平台 SDK
  3. MLaPP Chapter 8 Logistic Regression 逻辑斯特回归
  4. 字符集及八种编码对汉字和字母所占字节数
  5. 实验:数通之静态路由、ospf、vrrp、nqa综合实验(华为模拟器)
  6. 商业智能与大数据结合的一点感想(old)
  7. MapReduce实例----单表关联
  8. 波士顿动力新年炸场!人形机器人飞身转投工具包,最后体操式落地把人类给整不会了...
  9. 88亿美元的交易:HPE旗下大部分软件业务合并到Micro Focus
  10. 安装adobe系列应用出现Error无法继续安装,文件已损坏,无法打开解决方法