Java7并发编程实战(一) 守护线程的创建和运行
2015-07-14 13:10
489 查看
Java里有一种特殊的线程叫做守护(Daemon)线程,这种线程的优先级很低,通常来说,当一个应用程序里面没有其他线程运行的时候,守护线程才运行,当线程是程序中唯一运行的线程时,守护线程执行结束后,JVM也就结束了这个程序。因此,守护线程通常被用来作为同一程序中普通线程的服务提供者,通常是无线循环的,以等待服务请求或者线程任务。
代码实现
1:创建Event类,声明两个私有属性package com.packtpub.java7.concurrency.chapter1.recipe7.task; import java.util.Date; import java.util.Deque; import com.packtpub.java7.concurrency.chapter1.recipe7.event.Event; /** * Class that review the Event data structure and delete * the events older than ten seconds * */ public class CleanerTask extends Thread { /** * Data structure that stores events */ private Deque<Event> deque; /** * Constructor of the class * @param deque data structure that stores events */ public CleanerTask(Deque<Event> deque) { this.deque = deque; // Establish that this is a Daemon Thread setDaemon(true); } /** * Main method of the class */ @Override public void run() { while (true) { Date date = new Date(); clean(date); } } /** * Method that review the Events data structure and delete * the events older than ten seconds * @param date */ private void clean(Date date) { long difference; boolean delete; if (deque.size()==0) { return; } delete=false; do { Event e = deque.getLast(); difference = date.getTime() - e.getDate().getTime(); if (difference > 10000) { System.out.printf("Cleaner: %s\n",e.getEvent()); deque.removeLast(); delete=true; } } while (difference > 10000); if (delete){ System.out.printf("Cleaner: Size of the queue: %d\n",deque.size()); } } }
View Code
4:实现主类
public class Main { /** * Main method of the example. Creates three WriterTasks and a CleanerTask * @param args */ public static void main(String[] args) { // Creates the Event data structure Deque<Event> deque=new ArrayDeque<Event>(); // Creates the three WriterTask and starts them WriterTask writer=new WriterTask(deque); for (int i=0; i<3; i++){ Thread thread=new Thread(writer); thread.start(); } // Creates a cleaner task and starts them CleanerTask cleaner=new CleanerTask(deque); cleaner.start(); } }
打印结果
Cleaner: Size of the queue: 28 Cleaner: The thread 9 has generated an event Cleaner: Size of the queue: 28 Cleaner: The thread 11 has generated an event Cleaner: Size of the queue: 29 Cleaner: The thread 10 has generated an event Cleaner: Size of the queue: 28 Cleaner: The thread 9 has generated an event Cleaner: Size of the queue: 28 Cleaner: The thread 11 has generated an event Cleaner: Size of the queue: 29 Cleaner: The thread 10 has generated an event Cleaner: Size of the queue: 28 Cleaner: The thread 9 has generated an event Cleaner: Size of the queue: 28 Cleaner: The thread 11 has generated an event Cleaner: Size of the queue: 29 Cleaner: The thread 10 has generated an event Cleaner: Size of the queue: 29 Cleaner: The thread 9 has generated an event Cleaner: Size of the queue: 28
我们会发现,队列中的对象会不断增长至30个,然后程序结束,队列的长度维持在27-30之间,这个程序有3个WriteTask线程,每个线程向队列写入一个事件,然后休眠1秒钟,在第一个10s中,队列中有30个事件,直到3个WriterTask都结束后,CleanTask才开始执行,但是他没有删除任何事件,因为所有的事件都小于10秒钟,在接下来运行中,CleanTask每秒钟删除3个事件,同时WriteTask会写入3个对象,所以队列一直在27-30之间。
相关文章推荐
- java 框架Nutz
- JAVA学习第一天
- eclipse 设置/修改 快捷键
- Mac环境中MyEclipse安装
- Mac环境中MyEclipse安装
- 在Mac环境中JDK安装
- JNI实现回调| JNI调用JAVA函数|参数和返回值的格式
- JavaMail解析邮件内容(经典收藏)
- Eclipse当中的Copy Qualified Name
- java 关于日期
- Eclipse光标变成黑色方块解决方法
- JSON for java入门总结
- java中单利模式
- package-info.java文件分析
- java实现日期拆分的方法
- Eclipse 如何同时打开查看多个文件
- java检查数组是否有重复元素的方法
- Java设计模式之单例模式
- 用JAVA实现简单爬虫循环抓取
- bjjava初学2015-7-14