Java多线程之守护线程

一、前言

  • Java线程有两类:

    • 用户线程:运行在前台,执行具体的任务,程序的主线程,连接网络的子线程等都是用户线程

    • 守护线程:运行在后台,为其他前台线程服务

      • 特点:一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作

      • 应用:数据库连接池中的监测线程JVM启动后的监测线程

      • 最常见的守护线程:垃圾回收线程

      • 如何设置守护线程:可以通过Thread类的setDaemon(true)方法来设置当前的线程为守护线程

  • 注意事项:

    • setDaemon(true)必须在start方法之前调用,否则会抛出IllegalThreadStateException异常

    • 在守护线程中产生的新线程也是守护线程

    • 不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑

二、代码分析:

 package me.demo.daemon;

 import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Scanner; class DaemonThread implements Runnable { @Override
public void run() {
System.out.println("进入守护线程:" + Thread.currentThread().getName());
try {
WriteToFile();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("退出守护线程:" + Thread.currentThread().getName());
} private void WriteToFile() throws Exception {
File file = new File("E:" + File.separator + "daemon.txt");
// true代表追加操作
OutputStream os = new FileOutputStream(file, true);
int count = 0;
while (count < 999) {
os.write(("\r\nword" + count).getBytes());
System.out.println("守护线程" + Thread.currentThread().getName() + "向文件中写入了Word" + count++);
Thread.sleep(1000);
}
os.close();
} } public class DaemonThreadDemo { public static void main(String[] args) {
System.out.println("进入主线程:" + Thread.currentThread().getName());
DaemonThread daemonThread = new DaemonThread();
Thread thread = new Thread(daemonThread);
thread.setDaemon(true); // 设为守护线程
thread.start(); /**
* 主线程阻塞等待键盘输入 由于此时主线程是唯一的用户线程 所以当主线程退出,则守护线程也会退出
* 即while循环提前退出,导致守护线程写入数据的不完整性
*/
Scanner input = new Scanner(System.in);
input.next();
input.close();
System.out.println("退出主线程:" + Thread.currentThread().getName());
}
}

  运行这个程序,如果我们不做任何操作,他将会向E盘下的daemon.txt文件写入数据,直到while循环结束,并先后打印出退出守护线程和退出主线程字段信息,期间我们如果向控制台输入任意字符串并回车,由于主线程阻塞等待键盘输入,并且此时主线程是唯一的用户线程 所以当主线程退出,则守护线程也会退出,即while循环提前退出,导致守护线程写入数据的不完整性,这正应证了我上面提到的守护线程的特点:一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。

转载请注明出处及链接地址,欢迎转载!

Java多线程之守护线程的更多相关文章

  1. java多线程之守护线程与非守护线程

    在java线程中有两种线程,一种是用户线程,其余一种是守护线程. 守护线程具有特殊的含义,比如gc线程.当最后一个非守护线程执行完后,守护线程随着jvm一同结束工作. java中的守护线程需要将Dae ...

  2. java多线程之守护线程以及Join方法

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.守护线程概述及示例 守护线程就是为其它线程提供"守护"作用,说白了就是为其它线程服务的,比如GC线程. java程序中线程分 ...

  3. java多线程之守护线程(Daemon)

    https://blog.csdn.net/u010739551/article/details/51065923/

  4. Java多线程系列--“JUC线程池”03之 线程池原理(二)

    概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...

  5. Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗

    在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...

  6. Java多线程系列--“JUC线程池”06之 Callable和Future

    概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...

  7. Java多线程系列--“JUC线程池”02之 线程池原理(一)

    概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...

  8. Java多线程系列--“JUC线程池”04之 线程池原理(三)

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...

  9. Java多线程系列--“JUC线程池”05之 线程池原理(四)

    概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...

随机推荐

  1. 《VR入门系列教程》之8---GearVR

    高端移动虚拟现实设备---三星GearVR     Oculus Rift也许是虚拟现实头显的典范,但是它还是存在许多问题.首先,它需要基于一个具有强大图形计算能力的计算机,而使用一般的笔记本.苹果A ...

  2. Redis(五)--- Redis的持久化RDB与AOF

    一.Redis数据库 我们都知道Redis是基于内存的数据库,数据是以key-value键值对的方式存储的,那么key-value键值对是随意放在内存中的么,其实Redis的服务会创建很多的数据库空间 ...

  3. Python基础总结之第五天开始【认识简单的条件语句,也可以叫判断语句】(新手可相互督促)

    周五更新很累... 坚持,年薪20万又进了一步~~ python中的条件语句以[ if ]开头,条件语句成立时,运行该代码块,如果条件不成立,则跳过该代码块,执行后面的代码块. 简单的小示例: 输入性 ...

  4. 手工sql注入(重点)

    sql 子查询:() select goods_name from goods where goods_id=(select max(goods_id) from goods): 联合查询:selec ...

  5. JavaScript常用语句

    JavaScript常用语句 语句 语法 说明 简单语句 : 语句以:分号结束 语句块 {} 将一组语句组成语句块,ES中没有语句块作用域,也可用作对象字面量 添加标签语句 label 给代码添加标签 ...

  6. TIJ读书笔记-第21章-并发

    一本Think in java,从去年6月份开始读,读了快一年了,也快读完了,然而回头想想,却好像什么也不记得了,好记性不如烂笔头,那就从现在开始记录一下吧.由于现在在读的是并发,那就先从这章开始吧. ...

  7. Python3数据驱动ddt

    对于同一个方法执行大量数据的程序时,我们可以采用ddt数据驱动的方式,来对数据规范化整理及输出 一.需要使用python的ddt库,ddt,data,unpack方法 1.仅使用ddt和data,代码 ...

  8. SparkStreaming对接rabbitMQ

    /** * SparkStreaming对接rabbitmq java代码 */public class SparkConsumerRabbit { public static void main(S ...

  9. H3C模拟器实验之网络地址转换

    网络拓扑图 NOTE:各个设备的基本配置在拓扑图上已经标明(需要注意的是RTB的出接口也需要配置IP,但是使用ping -a 10.1.1.1 202.117.144.1 ping不通,这点不是很理解 ...

  10. 从原理层面掌握@SessionAttribute的使用【一起学Spring MVC】

    每篇一句 不是你当上了火影大家就认可你,而是大家都认可你才能当上火影 前言 该注解顾名思义,作用是将Model中的属性同步到session会话当中,方便在下一次请求中使用(比如重定向场景~). 虽然说 ...