Java 多线程之-----守护进程

守护进程,顾名思义就是默默在后台运行的进程,当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;
	}

	@Override
	public 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);
	}

	@Override
	public 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了

时间: 2024-10-04 09:26:48

Java 多线程之-----守护进程的相关文章

Java多线程基础:进程和线程之由来

在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累.由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助. 下面是本文的目录大纲: 一.操作系统中为什么会出现进程? 二.为什么会出现线程? 三.多线程并发 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文地址:

Java线程和守护进程

ava的线程机制,有两类线程:User Thread(用户线程).Daemon Thread(守护线程) . 操作系统里面是没有守护线程的概念,只有守护进程,但是Java语言机制是构建在JVM的基础之上的,意思是Java平台把操作系统的底层给屏蔽起来,而守护线程机制又是对JVM这样的平台凑合,于是守护线程应运而生. Daemon的作用是为其他线程的运行提供服务,比如说GC线程.其实User Thread线程和Daemon Thread守护线唯一的区别就在虚拟机的离开:如果User Thread全

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

进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都可以理解为一个进程 线程 进程中独立运行的子任务就是一个线程.像QQ.exe运行的时候就有很多子任务在运行,比如聊天线程.好友视频线程.下载文件线程等等. 创建线程的方式 创建线程有两种方式: 1.继承Thread,重写父类的run()方法. public class MyThread00 extends T

关于java多线程中守护线程的理解

在java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程.下面的方法就是用来设置守护线程的. 1 Thread daemonTread = new Thread(); 2 3 // 设定 daemonThread 为 守护线程,default false(非守护线程) 4 daemonThread.setDaemon(true); 5 6 // 验证当前线程是否为守护线程,返回 tr

java多线程以及Android多线程

Java 多线程 线程和进程的区别 线程和进程的本质:由CPU进行调度的并发式执行任务,多个任务被快速轮换执行,使得宏观上具有多个线程或者进程同时执行的效果. 进程:在操作系统来说,一个运行的程序或者说一个动态的指令集合通常对应一个进程Process,它是系统进行资源分配和调度的一个独立单位,也是拥有系统资源的基本单位.进程是系统中独立存在的实体,它可以拥有自己独立的资源,拥有自己私有的地址空间,进程之间不能直接访问其他进程的地址空间. 线程:线程是CPU调度的基本单位,也就是说在一个进程中可以

Unix环境高级编程(十三)守护进程

守护进程也称为精灵进程是一种生存期较长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.unix系统有很多守护进程,大多数服务器都是用守护进程实现的,例如inetd守护进程. 1.守护进程的特征 用ps命令察看一些常用的系统守护进程,看一下他们和几个概念:进程组.控制终端和会话有什么联系.执行: ps –axj ,结果如下所示: 从结果可以看出守护进程没有控制终端,其终端名设置为?,终端前台进程组ID设置为-1,ini

【搞懂Java多线程之二】多线程调度及守护进程

在前一篇文章中说到,所有处在就绪状态中的线程,操作系统会选择优先级最高的优先进行调度,那么是不是优先级高的线程就一定比优先级低的线程先执行呢?线程的优先级又是怎么划分的呢?这篇文章,楼楼就要来说说这个问题啦!欢迎关注我的个人博客主页www.anycodex.com 1.线程的优先级 在Java中,线程优先级的范围为0-10,整数值越大,说明优先级更高. 几个相关的宏定义: MAX_PRIORITY 10,最高优先级 MIN_PRIORITY 1,最低优先级 NORM_PRIORITY 5,默认优

centos下使用如何配置java守护进程

在 linux下,用守护进程的形式启动server是非常重要的一个问题.比如在php下可用php脚本处理,node.js下可用forever处理.在java下呢?有java wrapper. 1.下载Java wrapper Community版, http://wrapper.tanukisoftware.com/doc/english/download.jsp 下载wrapper-linux-x86-64-3.5.29.tar.gz. 2.解压,tar -xzvf wrapper-linux

Java 多线程详解(二)------如何创建进程和线程

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html 在上一篇博客中,我们已经介绍了并发和并行的区别,以及进程和线程的理解,那么在Java 中如何创建进程和线程呢? 1.在 Windows 操作系统中创建进程 在 windows 操作系统中,我们创建一个进程通常就是打开某个应用软件,这便在电脑中创建了一个进程.更原始一点的,我们在命令提示符中来做(我们以打开记事本这个进程为例): 第一步:windows+R,