博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发--守护线程(Daemon Thread)
阅读量:2443 次
发布时间:2019-05-10

本文共 1041 字,大约阅读时间需要 3 分钟。

Daemon线程

在Java中有两种线程:

  • 用户线程(User Thread)
  • 守护线程(Daemon Thread)

Daemon线程是一种支持型线程,因为它主要被用于程序中后台调度以及支持性工作。这意味着,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出。

  • 可以通过调用线程实例的setDaemon(true)将线程设置为Daemon线程。
  • 可以通过调用线程实例的isDaemon()方法,判断是否为Daemon线程,返回值为boolean。

注意:Daemon属性需要在启动线程之前设置,不能再启动线程之后设置。

Daemon线程被用作完成支持性工作,但是在Java虚拟机退出时,Daemon线程中的finally块不一定会执行,如下所示:

public class Daemon {
public static void main(String[] args) {
Thread thread = new Thread(new DaemonRunner(), "DaemonRunner"); thread.setDaemon(true); thread.start(); } static class DaemonRunner implements Runnable{
@Override public void run() {
try{
SleepUtils.second(10); }finally {
System.out.println("DaemonThread finally run."); } } }}

运行Daemon程序,可以看到在终端没有任何输出。

main线程启动了Daemon线程,在启动之后随着main方法执行完毕而终止,而Java虚拟机中已经没有非Daemon线程,虚拟机需要退出。

Java虚拟机中的所有Daemon线程都需要立即终止,因此DaemonRunner立即终止,但是DaemonRunner中的finally块并没有执行。

所以:在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或清理资源逻辑。

转载地址:http://yypqb.baihongyu.com/

你可能感兴趣的文章
vue watchers_具有Vue Watchers的简单异步无限滚动
查看>>
apollo服务器使用教程_使用Apollo Server和AdonisJS构建GraphQL服务器
查看>>
javascript 闭包_了解JavaScript闭包:实用方法
查看>>
laravel集成谷歌验证_如何将Google的两因素身份验证添加到Laravel
查看>>
rails 创建_使用Rails和Icecast创建在线流媒体广播
查看>>
票务小程序源码_使用AdonisJs构建支持票务应用程序-第2部分
查看>>
使用Vue,ASP.NET Core和Okta构建安全的待办应用
查看>>
前端长列表渲染优化_用于前端开发的浏览器渲染优化
查看>>
使用Vue.js和Electron创建桌面测验应用程序
查看>>
js 数组从头添加到数组_编码练习:从头开始构建JavaScript数组方法
查看>>
react-hooks_使用React Hooks构建一个React To-Do应用(无类组件)
查看>>
chrome开发者工具_如何使用Chrome开发者工具查找性能瓶颈
查看>>
vue 使用人脸识别_使用Vue.js和Kairos构建简单的人脸识别应用
查看>>
vue 构建单页应用_如何使用Vue 2构建简单的单页应用程序(第1部分)
查看>>
使用Webtask.io构建无服务器MERN Story应用程序-部署零:1
查看>>
使用Webtask.io构建无服务器的MERN Story应用程序-部署零:2
查看>>
firebase vue_Firebase Cloud Firestore入门:构建Vue联系人应用
查看>>
node.js hapi_使用Hapi使用JavaScript异步构建安全的Node.js应用程序
查看>>
javascript入门_Netlify入门:部署JavaScript应用程序的最简单方法
查看>>
react hooks使用_使用React Hooks将React类组件转换为功能组件的5种方法
查看>>