Java并发编程-03-守护线程的创建和运行

一、守护线程

1、守护线程的优先级很低

2、当一个应用程序里没有其他线程运行的时候,守护线程才运行。

3、当守护线程是唯一运行的线程时,守护线程运行结束后,JVM也就结束了这个程序

4、守护线程被用来作为同一程序中普通线程(也称为用户线程)的服务提供者。

5、守护线程通常是无线循环的,以等待服务请求或者执行线程的任务。

6、我们无法知道守护线程什么时候可以获取cpu的时钟

7、在其他线程运行的时候,守护线程也可能随时结束

8、java中守护线程的带表是java的垃圾回收器

二、测试守护线程

1、创建用户线程,负责将事件写入队列

2、创建守护线程,管理这个队列。

3、函数是setDaemon

public final void setDaemon(boolean on) {
        checkAccess();
        if (isAlive()) {
            throw new IllegalThreadStateException();
        }
        daemon = on;
    }

三、源码

package com.concurrent.threadManager;

import java.util.Date;
import java.util.Deque;
import java.util.concurrent.TimeUnit;

/**
 * 这是用户线程 负责每隔一秒,向队列写入一个event事件
 * 
 * @author Nicholas
 *
 */

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 class WriteTask implements Runnable {

	private Deque<Event> dequeEvent;

	public WriteTask(Deque<Event> dequeEvent) {
		this.dequeEvent = dequeEvent;
	}

	@Override
	public void run() {
		for (int i = 1; i < 100; i++) {
			Event event = new Event();
			event.setDate(new Date());
			event.setEvent(String.format(
					"The thread %s has generated an event", Thread
							.currentThread().getId()));
			dequeEvent.addFirst(event);

			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

package com.concurrent.threadManager;

import java.util.Date;
import java.util.Deque;

public class CleanTask extends Thread {

	private Deque<Event> dequeEvent;

	public CleanTask(Deque<Event> dequeEvent) {
		this.dequeEvent = dequeEvent;
		setDaemon(true);
	}

	@Override
	public void run() {
		while (true) {
			Date date = new Date();
			Clean(date);
		}
	}

	// 读取队列的最后一个事件对象,如果这个事件是10秒钟前创建的,则删除,然后检查下一个
	private void Clean(Date date) {
		long difference;
		boolean delete;
		if (dequeEvent.size() <= 0)
			return;
		delete = false;

		System.out.println("--------------------------");
		do {
			Event event = dequeEvent.getLast();
			difference = date.getTime() - event.getDate().getTime();
			if (difference > 10000) {
				System.out.printf("Cleaner : %s\n", event.getEvent());
				dequeEvent.removeLast();
				delete = true;
			}
		} while (difference > 10000);

		if (delete) {
			System.out.println("Cleaner : Size of the queue :"
					+ dequeEvent.size());
		}
	}
}

测试

	public void testDaemon() {
		// 创建队列对象,用来保存事件
		Deque<Event> dEvents = new ArrayDeque<Event>();

		WriteTask writeTask = new WriteTask(dEvents);
		for (int i = 0; i < 3; i++) {
			Thread thread = new Thread(writeTask);
			thread.start();
		}
		CleanTask cleanTask = new CleanTask(dEvents);
		cleanTask.start();
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值