Java守护线程与用户线程示例代码

  • 更新时间:2020-03-14 17:48:23
  • 编辑:陈正浩
给网友朋友们带来一篇Java相关的编程文章,网友闻梓蓓根据主题投稿了本篇教程内容,涉及到Java、用户线程、守护线程、详解Java线程-守护线程与用户线程相关内容,已被843网友关注,如果对知识点想更进一步了解可以在下方电子资料中获取。

参考资料

正文内容

详解Java线程-守护线程与用户线程

干java 开发这么多年, 之前一直没留意java 进程还区分守护进程和用户进程。守护进程这个概念最早还是在linux系统中接触的,直到近期使用java开发心跳检测功能时,使用Timer时才发现原来java也有守护线程的概念。

1. Java 线程

1.1 守护线程与用户线程

Java 线程分为守护线程(DaemonThread) 和 用户线程(UserThread)两类.

  1. 通常情况下,我们使用Thread 创建的线程在默认情况下都属于用户线程, 当在启动线程之前, 执行thread.setDaemon(true)时, 线程会变成守护线程。
  2. 其实在本质上,用户线程和守护线程并没有太大区别,唯一的区别就是会影响虚拟机的退出(程序的终止)。当jvm中只剩下守护线程时,虚拟机会退出,及程序终止;而当jvm中至少拥有一个用户线程时,jvm都不会退出。

1.2 守护线程特点

Java 中的守护线程和linux 中的守护进程还是有些区别的, linux 守护进程时系统级别的, 当系统退出时, 才会终止. 而java 中的守护线程时jvm 级别的, 当jvm中无任何用户进程时, 守护进程销毁, jvm 退出, 程序终止. 笔者认为java 守护进程的最主要的特点有:

  1. 守护进程是运行在程序后台的线程
  2. 守护进程创建的进程,依然时守护进程
  3. 守护进程不会影响jvm的退出,当jvm只剩余守护进程时,jvm 进行退出
  4. 守护进行在jvm退出时,自动销毁

在开发java 守护线程时, 需要注意:

  1. 在线程启动之前, 及执行thread.start() 方法前, 设置thread.setDemon(true);
  2. 在守护线程中启动的子线程也是守护线程
  3. 守护线程不建议进行写操作, 因为守护进程随时可能结束。

1.3 守护线程适用场景

针对于守护线程的特点,笔者认为,java 守护线程通常可用于开发一些为其它用户线程服务的功能。比如说心跳检测,事件监听等。Java 中最有名的守护进程当属GC(垃圾回收)

2. java 守护线程开发

开发守护进程时需要注意两点:

  1. 必须在线程启动之前,即执行thread.start()方法前, 执行thread.setDaemon(true) 方法,否则会抛出异常IllegalThreadStateException
  2. 守护线程中创建的线程也是守护线程

2.1 测试程序退出

  1. 注释thread.setDaemon(true)时, 线程为用户线程, 程序进行无线循环, 程序不终止。
  2. 设置thread.setDaemon(true)后, 线程变成守护线程, 程序直接终止, 仅输出一行信息"main thread done"。 因为程序执行完system 语句之后, main 程序作为唯一的一个用户线程执行结束了, jvm 中只剩下一个守护进程,所以jvm 便退出了。
public class TestThread {

 public static void main(String[] args) {

  AnsyTask ansyTask = new AnsyTask();

  Thread thread = new Thread(ansyTask);

  // 设置线程为异步线程
  // thread.setDaemon(true);

  // 启动线程
  thread.start();
  
  System.out.println("main thread done");
 }
}

class AnsyTask implements Runnable{

 @Override
 public void run() {
  while (true){
   System.out.println(LocalDateTime.now() + "-hello,thread");
  }
 }
}

2.2 测试守护线程中创建新的线程

测试会发现, 默认情况下, 守护线程创建的子线程依然是守护线程,用户创建的守护线程依然时用户线程。也可以在创建子线程时通过setDaemon()方法修改.

public class TestThread {

 public static void main(String[] args) throws InterruptedException {

  AnsyTask ansyTask = new AnsyTask();

  Thread thread = new Thread(ansyTask);

  // 设置线程为异步线程
  thread.setDaemon(true);

  // 启动线程
  thread.start();

  // 给守护线程点儿执行时间
  Thread.sleep(1000l);
 }
}

class AnsyTask implements Runnable{

 @Override
 public void run() {
  Thread thread = new Thread("subThread");
  System.out.println(thread.getName() + " is daemon:" + thread.isDaemon());
 }
}

以上所述是小编给大家介绍的Java守护线程与用户线程详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

Java相关教程

  • 详解java连接mysql数据库的五种方式

    这篇文章主要介绍了详解java连接mysql数据库的五种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    发布时间:2021-05-02

  • JAVA Iterator 转成 List 的操作

    这篇文章主要介绍了JAVA Iterator 转成 List 的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    发布时间:2021-05-02

  • Java性能权威指南

    Java性能权威指南

    本书对Java 7和Java 8中影响性能的因素展开了全面深入的介绍,讲解传统上影响应用性能的JVM特征,包括即时编译器、垃圾收集、语言特征等。内容包括:用G1垃圾收集器应用的吞吐量;使用Ja

    大小:66.1 MBJava电子书

  • Effective Java

    Effective Java

    本书介绍了在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么

    大小:56 MBjava电子书

  • Java WebSocket编程:发、部署和保护动态Web应用

    Java WebSocket编程:发、部署和保护动态Web应用

    精通Java WebSocket应用开发,充分利用最先进的通信技术构建动态企业级Web应用。《Java WebSocket编程 开发、部署和保护动态Web应用》一书由Java WebSocket编程权威专家撰写,提供了实际的开发策略和

    大小:74.3 MBJava WebSocket电子书

  • JavaScript DOM编程艺术

    JavaScript DOM编程艺术

    非常畅销书全新升级,首版销售量确保。 书中详细说明开发Web运用的基石W3C的DOM标准,由提倡Web标准的大神领军人物执笔用心编写,表明了前端工程师的人生真谛,是学习培训JavaScript和DOM开发

    大小:109.2 MBJavaScript电子书

  • Java Web开发实例大全:提高卷

    Java Web开发实例大全:提高卷

    本书筛选、汇集了Java Web开发从基础知识到高级应用各个层面,含600经典实例及源码分析,23个应用方向,两卷共1200例,46个方向,供学习、速查、实践练习的超全参考手册

    大小:179.4 MBJava电子书

  • Java并发编程从入门到精通

    Java并发编程从入门到精通

    《Java并发编程从入门到精通》 作者结合自已10多年Java并发编程经验,详细介绍了Java并发编程的基础概念、工作原理、编程技巧和注意事项,对Java高性能高并发编程有极大的参考价值。 本书内

    大小:93.4 MBJava编程电子书

  • 数据结构与算法经典问题解析:Java语言描述

    数据结构与算法经典问题解析:Java语言描述

    数据结构与算法经典问题解析:Java语言描述(原书第2版) 是一本数据结构方面的优秀教材,以Java为描述语言,介绍了计算机编程中使用的数据结构和算法。本书强调问题及其分析,而非理论阐

    大小:107.1 MBJava语言电子书

用户留言