- 浏览: 1666996 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (335)
- uml (11)
- java (318)
- python (11)
- socket (2)
- ant (1)
- data structures (58)
- algorithms (67)
- concurrency (16)
- multithreading (16)
- mysql (2)
- ubuntu (2)
- c语言 (1)
- lucene (0)
- elasticsearch (0)
- django (1)
- 读书 观点 (2)
- 读书 (4)
- 观点 (4)
- collections (8)
- nio (1)
- io (2)
- 系统集成 (1)
- activemq (2)
- restful (0)
- web service (0)
- HttpClient (1)
- serializable (0)
- annotation (1)
- jdbc (3)
- classloader (0)
- regular expression (1)
- jpa (4)
- jvm (0)
- reflection (1)
- commons-pool2 (2)
- javamail (1)
- velocity (1)
- mathematics (3)
- graph (13)
- LeetCode (159)
- scala (0)
- spring (24)
- maven (5)
- spring batch (1)
- quartz (2)
- IOC (2)
- ORM (3)
- hibernate (2)
- aop (4)
- redis (0)
- zookeeper (0)
- spring mvc (4)
- ELK (1)
- string (1)
- gradle (1)
- mybatis (5)
- docker (0)
- servlet (0)
- log4j2 (1)
- html (0)
- css (0)
最新评论
-
nucleus:
貌似是因为图片的路径是http的缘故:http://dl2.i ...
spring container 实现分析:BeanWrapper -
nucleus:
nucleus 写道BeanWrapper这一块相关的类结构如 ...
spring container 实现分析:BeanWrapper -
nucleus:
BeanWrapper这一块相关的类结构如下图:文中提到的上述 ...
spring container 实现分析:BeanWrapper -
leshy:
inventory.sort(Comparator.compa ...
java8 lambda表达式学习总结 -
Leisurez:
di1984HIT 写道xuexile~hahaha~
activemq的几种基本通信方式总结
daemon线程的概念
在学习操作系统概念的时候,我们就曾听说过daemon的概念。daemon本身指的是在后台运行的进程或者线程,一般用来提供某些不需要与用户直接交互的服务,有点像我们见到的一些系统服务。在java线程中,一般可以分为两类,一类是普通的线程,就是那些我们通过常用的Thread类或者Runnable接口实现并启动的类。还有一类是daemon线程。这种线程也通过和创建普通线程同样的方式来创建,不过需要通过setDaemon方法设置为daemon线程。
daemon线程有几个典型的特征:
1. daemon线程是运行于后台的,不和用户直接交互。
2. 相对普通的线程来说,daeomn线程可以说是普通线程的下属,它的优先级要低一些。
3. daemon线程具有一定程度的继承性,这个继承性不是指类的继承,而是指当一个daemon线程创建一个新线程的话,这个新创建的线程就默认为daemon线程了。
4. 和普通线程的退出机制不同,在jvm即将关闭的时候,普通线程需要执行一系列的记录或者退出方法,比如需要执行finalize方法的则需要执行这部分,有finally块的代码也必须执行。而daemon线程退出的时候,jvm直接将它丢弃并退出,里面就算有finally块定义的代码也不会被执行。
一个daemon线程的示例
创建或者使用daemon线程一般包括一下3个步骤:
1. 如果线程本身就是daemon线程了,那么通过常规线程创建手段创建出来的就已经是daemon线程。
2. 如果通过普通线程创建创建出来的话,需要在启动线程前调用setDaemon()方法。切记,一定要在调用start()方法前。
3.我们可以通过调用isDaemon()方法来判断一个线程是否为daeomn.
下面是示例代码:
class MyDaemon implements Runnable { Thread thrd; MyDaemon() { // Create the thread thrd = new Thread(this); // Set to daemon thrd.setDaemon(true); // Start the thread thrd.start(); } public void run() { try { for(;;) { System.out.print("."); Thread.sleep(1000); } } catch(InterruptedException exc) { System.out.println("MyDaemon interrupted."); } } } class DaemonDemo { public static void main(String[] args) { MyDaemon dt = new MyDaemon(); if(dt.thrd.isDaemon()) System.out.println("dt is a daemon thread."); System.out.println("Sleeping in main thread."); try { Thread.sleep(10000); } catch(InterruptedException exc) { System.out.println("Main thread interrupted."); } System.out.println("\nMain thread ending."); } }
在上面的代码中,我们实现Runnable接口定义一个MyDaemon类,在构造函数中调用setDaemon()设置该线程为daemon.在main方法中启动MyDaemon线程之后,main方法结束时daemon线程也自动结束了。上述代码的执行结果如下:
dt is a daemon thread. Sleeping in main thread. .......... Main thread ending.
一个比较有意思的事情就是,如果我们将前面代码里setDaemon()方法的这一行注释了,也就是说将该线程设置为普通的用户线程,再执行上面的代码时,我们会发现,程序不会终止,会一直执行下去,虽然主线程已经结束了。其输出的结果会像如下所示:
Sleeping in main thread. .......... Main thread ending. .......................
设置daemon线程的意义
从前面的理解来看,daemon线程有点像一个我们画的草图,随时可以丢弃。它一般是用于在jvm关闭的时候,我们需要启动一些线程做一些辅助性的工作,但是我们又不希望这种工作妨碍到jvm正常关闭。和其他正常的线程来说,或许我们应该称之为不碍事的线程更合适。
daemon线程的一些应用
daemon线程在java中有很多地方用到,一个典型的就是垃圾回收的GC线程。另外如果我们需要用线程做一些比如时间提醒,标记等事情,采用daemon线程也是一个比较合适的选择。
又一个daemon的示例
根据前面的理解,我们再尝试一个更复杂的daemon应用。假定我们在一个应用中需要定义一些时间通知,比如说设置在某个指定的时候弹出一个会议通知的提醒。这是一个比较常见的场景,可以用daemon线程来实现。
具体的代码实现如下:
import java.util.*; class Reminder implements Runnable { Calendar reminderTime; String message; Reminder(String msg, int delay) { message = msg; // Get the current time and date. reminderTime = Calendar.getInstance(); // Add the delay to the time and date. reminderTime.add(Calendar.SECOND, delay); System.out.printf("Reminder set for %tD %1$tr\n", reminderTime); // Create the reminder thread. Thread dThrd = new Thread(this); // Set to daemon dThrd.setDaemon(true); // Start execution. dThrd.start(); } // Run the reminder. public void run() { try { for(;;) { // Get the current time and date. Calendar curTime = Calendar.getInstance(); // See if it's time for the reminder. if(curTime.compareTo(reminderTime) >= 0) { System.out.println("\n" + message + "\n"); break; } Thread.sleep(1000); } } catch(InterruptedException exc) { System.out.println("Reminder interrupted."); } } } class ReminderDemo { public static void main(String[] args) { // Get a reminder 2 seconds from now. Reminder mt = new Reminder("Call Harry", 2); // Keep the main thread alive for 20 seconds. for(int i = 0; i < 20; i++) { try { Thread.sleep(1000); } catch(InterruptedException exc) { System.out.println("Main thread interrupted."); } System.out.print("."); } System.out.println("\nMain thread ending."); } }
我们设置了一个daemon线程,在一个无限循环里比较当前时间和指定的时间,在达到指定的时间时则显示一个提醒消息。上述代码的输出如下:
Reminder set for 10/21/12 01:57:10 PM .. Call Harry .................. Main thread ending.
总结
悄悄的,daemon线程走了,正如daemon线程悄悄的来;挥一挥手,带不走jvm的一片云彩:)
参考资料
Herb Schildt’s Java Programming Cookbook
发表评论
-
spring源代码分析:aop的实现
2018-10-03 23:32 687简介 在之前的文章里我们讨论过一些程序构建Pro ... -
java annotation基础
2018-06-30 16:41 833简介 之前有一篇简短的文章讨论过annotati ... -
spring源代码分析:annotation支持的实现
2018-09-03 23:31 2461简介 在之前的文章里,我们讨论了spring I ... -
spring container 实现分析:BeanFactory and ApplicationContext
2018-06-02 18:29 1406简介 在之前的文章里,我们讨论过作为spring ... -
spring aop: ProxyFactory
2018-04-30 16:45 789简介 在之前的文 ... -
日志与log4j2的配置和应用总结
2018-02-15 15:47 12196简介 通常我们在日常的应用开发中,日志起到一个非 ... -
Java servlet学习总结
2018-01-02 21:14 0简介 应用系统架构的演化(从CS到BS) ... -
spring container 实现分析:BeanWrapper
2018-02-19 18:10 1856简介 在之前的一篇文章里, 我们基于《Exper ... -
spring propertyeditor
2017-10-26 09:17 0pro spring 5 chapter 4, page ... -
spring bean life cycle
2018-02-25 13:30 871简介 在使用spring bean的过程中,有一个 ... -
spring container的设计与实现分析
2017-10-08 21:31 2656简介 在之前的一 ... -
jdbc数据访问的封装和演化
2017-09-16 17:00 2601简介 在使用传统jdbc的方式来访问数据的时候, ... -
Boyer Moore算法分析总结
2017-03-31 18:42 3483简介 在之前的文章里,对于字符串的搜索算法,我曾 ... -
mybatis学习总结:mybatis和spring, spring boot的集成
2017-03-04 18:07 2466简介 在前面的讨论里已经提到了mybatis的各种配置 ... -
mybatis学习总结:annotation与xml结合示例
2017-02-25 21:09 3649简介 在之前的文章里讨论过mybatis纯xml或者 ... -
mybatis学习总结:对象关系映射的xml配置实现
2017-02-19 23:03 4010简介 在之前的文章里已经讨论过mybatis的基本配 ... -
mybatis学习总结:annotation示例改进
2017-01-24 09:06 3386简介 在前一篇文 ... -
mybatis学习总结:基础示例
2017-01-21 23:30 844简介 mybatis是一个比较流行的ORM框架, ... -
gradle学习总结
2016-12-18 21:01 4531简介 Java的自动化构建工具比较多,从最开始的an ... -
String sort的几种方法
2016-10-16 23:07 2119简介 在之前的一 ...
相关推荐
concurrency:Java Concurrency in Practice源代码
The Art of Concurrency: A Thread Monkey's Guide to Writing Parallel Applications PDF文件,很清晰,,, Intel资深工程师分享并发编程知识及内幕技术 详述如何在各种算法中使用线程化方法 开发并行代码算法...
Java Concurrency in Practice 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者...
Concurrency项目介绍多线程软件架构软件架构说明安装教程xxxxxxxxxxxx使用说明xxxxxxxxxxxx参与贡献Fork 本项目新建 Feat_xxx 分支提交代码新建 Pull Request码云特技使用 Readme_XXX.md 来支持不同的语言,例如 ...
Concurrency Java多线程学习
java-concurrency:代码审查清单
Java Concurrency in practice
<<java并行编程>>英文版chm格式,英文名称<Java Concurrency in Practice>,一直想买这本书,但总是缺货,找到了电子版,分享给大家。 Java Concurrency in Practice By Brian Goetz, Tim Peierls, Joshua Bloch,...
Java Concurrency Programming Lessons.
Java concurrency in Practice高清pdf,带目录标签,Java并发实战
java concurrency in practice
介绍java多线程的超经典的书,不需要多介绍了。这是完整版。压缩包内包含两个版本的pdf,都是英文版。建议看英文版,因此中文版翻译得超烂。与此同时,压缩包内还有一个java多线程总结.ppt!
Java Concurrency in Practice JAVA并发编程实践中文版(全)第二部分
Java并发 Java并发教程
Java Concurrency in Practice源码
正规PDF版本的 Java Concurrency In Practice。 经典著作,学习有益!
java8 源码 Java 并发多线程从简到全 参考: 目录: [TOC] 相关文档: kwseeker/netty Executors线程池.md 1 基本概念 1.1 CPU与线程的关系 1.2 线程与进程的区别和关系 1.3 吞吐量 1.4 线程安全 1.5 线程声明周期 ...
Get an easy introduction to reactive streams in Java to handle concurrency, data streams, and the propagation of change in today's applications. This compact book includes in-depth introductions to ...
java8 源码 并发操作合集 这是一个关于并发的系列。以实战为驱动,了解并发编程中的那些骚操作。文中的示例代码和部分解释来源于网络,你可以把这个系列当做一本工具书,想不起来的时候来看一看,顺便star一发也是...