- 浏览: 1683815 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 748简介 在之前的文章里我们讨论过一些程序构建Pro ... -
java annotation基础
2018-06-30 16:41 893简介 之前有一篇简短的文章讨论过annotati ... -
spring源代码分析:annotation支持的实现
2018-09-03 23:31 2570简介 在之前的文章里,我们讨论了spring I ... -
spring container 实现分析:BeanFactory and ApplicationContext
2018-06-02 18:29 1479简介 在之前的文章里,我们讨论过作为spring ... -
spring aop: ProxyFactory
2018-04-30 16:45 851简介 在之前的文 ... -
日志与log4j2的配置和应用总结
2018-02-15 15:47 12334简介 通常我们在日常的应用开发中,日志起到一个非 ... -
Java servlet学习总结
2018-01-02 21:14 0简介 应用系统架构的演化(从CS到BS) ... -
spring container 实现分析:BeanWrapper
2018-02-19 18:10 2000简介 在之前的一篇文章里, 我们基于《Exper ... -
spring propertyeditor
2017-10-26 09:17 0pro spring 5 chapter 4, page ... -
spring bean life cycle
2018-02-25 13:30 938简介 在使用spring bean的过程中,有一个 ... -
spring container的设计与实现分析
2017-10-08 21:31 2796简介 在之前的一 ... -
jdbc数据访问的封装和演化
2017-09-16 17:00 2705简介 在使用传统jdbc的方式来访问数据的时候, ... -
Boyer Moore算法分析总结
2017-03-31 18:42 3566简介 在之前的文章里,对于字符串的搜索算法,我曾 ... -
mybatis学习总结:mybatis和spring, spring boot的集成
2017-03-04 18:07 2517简介 在前面的讨论里已经提到了mybatis的各种配置 ... -
mybatis学习总结:annotation与xml结合示例
2017-02-25 21:09 3714简介 在之前的文章里讨论过mybatis纯xml或者 ... -
mybatis学习总结:对象关系映射的xml配置实现
2017-02-19 23:03 4072简介 在之前的文章里已经讨论过mybatis的基本配 ... -
mybatis学习总结:annotation示例改进
2017-01-24 09:06 3447简介 在前一篇文 ... -
mybatis学习总结:基础示例
2017-01-21 23:30 906简介 mybatis是一个比较流行的ORM框架, ... -
gradle学习总结
2016-12-18 21:01 4643简介 Java的自动化构建工具比较多,从最开始的an ... -
String sort的几种方法
2016-10-16 23:07 2197简介 在之前的一 ...
相关推荐
此外,Java还支持守护线程(daemon threads)和线程组。 2. **ExecutorService与ThreadPoolExecutor**:`ExecutorService`是`java.concurrent`包中的一个接口,它代表一个线程池,用于管理和控制线程。`...
2. **守护线程**:`Daemon`线程是一种特殊的线程,当所有非守护线程结束时,JVM会退出,即使还有守护线程在运行。Java中的`setDaemon(true)`方法可以将线程设置为守护线程。 3. **线程池**:Java提供`...
"Java Concurrency"这个话题涵盖了如何在Java环境中管理多个执行线程,以实现高效且安全的并行处理。本资料主要关注的是`ThreadLocal`类,这是一个强大的工具,用于在多线程环境下保持线程局部变量。 `ThreadLocal`...
- **Daemon线程**:后台运行的线程,不会阻止程序的退出。 9. **Future和Callable** - **Future**:代表异步计算的结果,提供了检查计算是否完成、获取结果、取消任务等方法。 - **Callable**:与Runnable类似,...
3. 线程的分类:Java 中的线程分为两种:守护线程(Daemon)和用户线程(User)。 4.daemon 的作用:Daemon 是为其他线程提供服务,例如 JVM 的垃圾回收线程是一个守护线程。 5. 多线程中的上下文切换:多线程会...
Java并发是Java编程中不可或缺的一部分,它涉及到多线程、同步机制、线程安全等内容,是提高程序性能和效率的关键技术。在这个“concurrency-in-java”项目中,我们旨在为初学者提供一个易于理解的入口,通过实际...
1. **守护线程与本地线程**:守护线程(Daemon Thread)是一种不会阻止程序退出的线程,如垃圾回收器就是守护线程。本地线程(User Thread)则是普通线程,当所有本地线程结束后,程序才会终止。 2. **线程与进程的...
守护线程(Daemon Thread) 守护线程不会阻止JVM的退出,如后台的日志服务或垃圾回收线程。通过调用`setDaemon(true)`方法,可以将一个线程设置为守护线程。 总结,理解并熟练掌握Java并发编程是提升程序性能和...
- **守护线程**:在 Java 中,守护线程(Daemon Thread)是一种特殊的后台线程,它不会阻止程序的关闭。当所有非守护线程结束运行后,Java 虚拟机将会退出。守护线程主要用于执行后台任务,例如垃圾回收器就是一个...
在Java编程语言中,线程(Thread)、同步(synchronized)和并发(Concurrency)是核心概念,对于构建高效、可扩展的应用程序至关重要。线程允许程序同时执行多个任务,而同步是控制多个线程对共享资源的访问,以...
Java提供了多种并发工具,如线程(Thread)、守护线程(Daemon Thread)、线程池(ThreadPool)、Executor框架以及并发集合类等,帮助开发者构建并行应用程序。 1. **线程和线程安全**:Java中的线程是程序执行的...
当JVM退出时,如果还有Daemon线程运行,JVM会强制终止这些线程,不会等待它们执行完成。 乐观锁和悲观锁是两种并发控制的方法。乐观锁通常通过版本号或者时间戳来实现,适用于读多写少的场景;悲观锁则通过锁机制来...
6. **并发编程(Concurrency)**:Java提供了丰富的并发API,如线程(Thread)、守护线程(Daemon)、执行器服务(ExecutorService)以及锁和同步机制,帮助开发者创建高效的多线程程序。 7. **反射(Reflection)*...
Java通过`Thread`类实现了线程的创建和管理,同时JVM层面也提供了守护线程(Daemon Thread)的概念。 2. **同步机制**:Java提供了多种同步机制,包括`synchronized`关键字、`Lock`接口及其实现(如`ReentrantLock`...