声明:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:方腾飞
守护线程的创建和运行
Java有一种特别的线程叫做守护线程。这种线程的优先级非常低,通常在程序里没有其他线程运行时才会执行它。当守护线程是程序里唯一在运行的线程时,JVM会结束守护线程并终止程序。
根据这些特点,守护线程通常用于在同一程序里给普通线程(也叫使用者线程)提供服务。它们通常无限循环的等待服务请求或执行线程任务。它们不能做重要的任务,因为我们不知道什么时候会被分配到CPU时间片,并且只要没有其他线程在运行,它们可能随时被终止。JAVA中最典型的这种类型代表就是垃圾回收器。
在这个指南中, 我们将学习如何创建一个守护线程,开发一个用2个线程的例子;我们的使用线程会写事件到queue, 守护线程会清除queue里10秒前创建的事件。
准备
指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。
怎么做呢…
按照这些步骤来实现下面的例子:
1. 创建 Event 类. 这个类只是用来储存我们程序里的工作的事件信息。声明2个属性,一个是java. util.Date 类型的 date 和另一个是String 类型的event 。并生成它们的读值和写值方法。
2. 创建 WriterTask 类并实现Runnable接口。
1
|
public class WriterTask implements Runnable {
|
3. 声明queue,储存事件并实现类的构造函数,初始化queue。
1
|
private Deque<Event> deque;
|
2
|
public WriterTask (Deque<Event> deque){
|
4. 实现这个任务的 run() 方法 。 此方法有100个循环。在每个循环中我们会创建 一个Event对象,并保存到 queue里, 然后休眠1秒。
03
|
for ( int i= 1 ; i< 100 ; i++) {
|
04
|
Event event= new Event();
|
05
|
event.setDate( new Date());
|
06
|
event.setEvent(String.format( "The thread %s has generated an event" ,Thread.currentThread().getId()));
|
07
|
deque.addFirst(event);
|
09
|
TimeUnit.SECONDS.sleep( 1 );
|
10
|
} catch (InterruptedException e) {
|
5. 创建 CleanerTask 类并一定扩展Thread类。
1
|
public class CleanerTask extends Thread {
|
6. 声明 queue,储存事件并实现类的构造函数,初始化queue,在这个构造函数,用setDaemon() 方法让此线程成为守护线程。
1
|
private Deque<Event> deque;
|
2
|
public CleanerTask(Deque<Event> deque) {
|
7. 实现run()方法。它是无限循环来获取当前日期并调用 clean() 方法.
4
|
Date date = new Date();
|
8. 实现 clean() 方法. 它获取最后的事件,如果它在10秒前被创建,就删除它并查看下一个事件。如果一个事件被删除,它会写一个事件信息和queue的新的大小,为了让你看到变化过程。
01
|
private void clean(Date date) {
|
04
|
if (deque.size()== 0 ) {
|
09
|
Event e = deque.getLast();
|
10
|
difference = date.getTime() - e.getDate().getTime();
|
11
|
if (difference > 10000 ) {
|
12
|
System.out.printf( "Cleaner: %s\n" ,e.getEvent()); deque.removeLast();
|
15
|
} while (difference > 10000 );
|
17
|
System.out.printf( "Cleaner: Size of the queue: %d\n" ,deque. size());
|
9. 现在实现主类。 创建一个类名为 Main 和 main() 方法。
2
|
public static void main(String[] args) {
|
10. 创建使用 Deque 类的queue 来保存事件。
1
|
Deque<Event> deque= new ArrayDeque<Event>();
|
11. 创建 和开始3个 WriterTask 线程和一个 CleanerTask.
1
|
WriterTask writer= new WriterTask(deque);
|
2
|
for ( int i= 0 ; i< 3 ; i++){
|
3
|
Thread thread= new Thread(writer);
|
6
|
CleanerTask cleaner= new CleanerTask(deque);
|
12. 运行程序查看结果。
它是怎么工作的…
如果分析这个程序的输出,你可以发现queue可以一直增加直到它有30个事件,然后它的大小会在27-30之间直到运行结束。
程序开始时有3个 WriterTask 线程。每个线程写一个事件然后休眠1秒。10秒之后,我们有30个事件在queue里。在这10秒内,当3个 WriterTask 线程休眠时, CleanerTasks已经开始运行,但是它没有删除任何事件,因为所有事件都才生成不到10秒。在剩下的运行里,CleanerTask 每秒删除3个事件, 然而3个 WriterTask 线程会另写3个,所以queue的大小在27-30之间。
你可以修改 WriterTask 线程的休眠时间。如果你使用一个较小的值,你会发现CleanerTask 被分配到 CPU 时间片会更少,由于 CleanerTask 没有删除任何事件,所以queue大小会一直增加。
更多…
只能在start() 方法之前可以调用 setDaemon() 方法。一旦线程运行了,就不能修改守护状态。
可以使用 isDaemon() 方法来检查线程是否是守护线程(方法返回 true) 或者是使用者线程 (方法返回 false)。
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 线程管理(七)守护线程的创建和运行
线程管理(七)守护线程的创建和运行相关推荐
- Java中的守护线程和非守护线程(转载)
<什么是守护线程,什么是非守护线程> Java有两种Thread:"守护线程Daemon"(守护线程)与"用户线程User"(非守护线程). 用户线 ...
- 守护线程和非守护线程
直觉上来讲,守护线程和main相关 Java中有两种线程,一种是用户线程,另一种是守护线程. 用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止(另一条执行路径) 守护线程当进程不存在或主 ...
- Java的守护线程和非守护线程
一.守护线程 java分为两种线程:用户线程和守护线程 守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因此 ...
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括: 1. 线程优先级的介绍 2. 线程优先级的示例 3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/s ...
- 守护线程与非守护线程
Java中有两种线程,一种是用户线程,另一种是守护线程. 用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止 守护线程当进程不存在或主线程停止,守护线程也会被停止. 使用setDaemon ...
- java的守护线程与非守护线程
守护线程最典型的应用就是GC,它是一个很好的守护者. 最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程) ...
- python多线程threading之阻塞线程(join)线程同步和守护线程(setDaemon(True))实例详解
一.多线程(主线程和子线程同时执行) 1.主线程是程序本身,看不到的,主线程和子线程没有依赖关系,同步执行的,若主线程先执行完,会等子线程执行完毕,程序结束 2.启动一个线程就是把一个函数传入并创建T ...
- 多线程、并发/并行、自定义线程类、线程安全、守护线程、定时器、线程状态、线程池
目录 进程和线程: 进程: 线程: 多线程的好处: 线程调度: 分时调度: 抢占式调度: 并发与并行: 线程的生命周期: 实现线程的两种基本方式(还有第三种): 创建Thread线程类: 创建Runn ...
- 多线程基础-守护线程与非守护线程
守护线程与非守护线程 1.线程分类: 2.程序线程: 3.主线程与非守护线程 4.主线程与守护线程 5.主线程.守护线程.非守护线程 6. java虚拟机是如何退出的? 1.线程分类: 守护线程 非守 ...
- 守护线程是什么?守护线程和非守护线程的区别是?守护线程的作用是?
守护线程是区别于用户线程,用户线程即我们手动创建的线程,而守护线程是程序运行的时候在后台提供一种通用服务的线程.垃圾回收线程就是典型的守护线程. 守护线程和非守护线程的区别是 public stati ...
最新文章
- linux hosts文件如何修改_如何修改hosts文件?让你简单方便快捷管理
- 数据挖据之GeoHash核心原理解析
- ecg 幅度_ECG信号中一些运动伪差的讨论
- Java提升篇:对象克隆(复制)
- MySQL缓存的查询和清除命令使用详解
- 冒泡排序 自带时间复杂度测试
- 6000毫安以上智能手机_三星超长续航神机,6000毫安+128GB,上市半年不到跌至1499...
- Matplotlib中的“ plt”和“ ax”到底是什么?
- 【2019牛客暑期多校训练营(第二场)- F】Partition problem(dfs,均摊时间优化)
- iOS 应用启动慢的原因找到了!
- wincc和matlab通信,Matlab与WinCC之间的数据通信.doc
- java mysql dump_mysql dump备份和恢复
- 2022年认证杯SPSSPRO杯数学建模A题(第二阶段)人员的紧急疏散求解全过程文档及程序
- python判断图片相似度_图像检索系列——利用 Python 检测图像相似度!
- Teams Meeting 实时事件通知
- 学成在线 第4天 讲义-页面静态化 页面预览
- wamp中mysql 5.7.28无法在win10中开启的处理。
- ap计算机科学考题,把AP计算机A Free Response题做成阅读理解理解翻译题
- jsp中用自定义标签实现简单的分页
- Node-RED编程基础
热门文章
- Spring + JDK Timer Scheduler Example--reference
- 基于 Java 2 运行时安全模型的线程协作--转
- 中央纪委网站:​深度关注 | 元宇宙如何改写人类社会生活
- opencv python 图像形态学操作/图像腐蚀/图像膨胀/开运算/闭运算/顶帽/黑帽
- Apache ZooKeeper - JMX监控 ZooKeeper 的运行状态
- MySQL-在线处理大表数据 在线修改大表的表结构
- 并发编程-18AQS同步组件之 CyclicBarrier 同步屏障
- Android动画效果-更新中
- 改计算机用户头像,Windows 8.1
- linux bin模式,binlog有哪些工作模式?Linux云计算运维入门