java线程基础巩固---Daemon线程的创建以及使用场景分析
daemon线程既守护线程,而在jdk中对于Thread中针对守护线程有专门的API,如下:

而之前在公司项目中就看到过有人使用过Thread中的这个API,但是对于它的使用场景完全不知,所以这次好好的学习一下,下面直接上代码来阐述它。

编译运行:

很简单,但是这里可以看到在main函数执行完成之后【关于main函数是否真的退出可以用jconsole去查看一下既可,之前也已经查看过】,咱们新创建的Thread-0线程并未退出,这时由于咱们的Thread-0线程还是属于活跃状态,并未执行完,那接下来给我们的线程设置一个daemon属性再看结果,如下:

编译运行:

可见这时当main线程一结束,其我们的线程也退出了。这也是使用守护之后的一个直观效果,而实用价值其实也是蛮大的,这时可以联想到一个实际要使用daemon线程的场景:客户端与服务器端建立一个TCP的长链接,然后当连接建立之后就创建一个线程来给服务器发送心跳包以便服务器能监听客户端的网络状态,这时如果连接断开了那这个心跳线程也得跟着断开,下面来模拟一下:

编译运行:

发送t线程一执行完,在里面创建的心跳线程也立马终止了,刚好满足我们的场景需求,而如果不给心跳线程设置成deamon线程再看结果:


很显然当t线程结束之后里面的心跳线程就不会退出了,当然啦不通过给心跳线程设置守护线程也能达到当连接断开之后其心跳线程也退出,自己写逻辑控制既可,但是有了守护线程那这个逻辑我们就可以避免自己写了。
下面再来细读一下jdk对它的描述:

那不信这个邪,来试一下:

编译运行:

这个异常在JDK中也有描述,如下:

java线程基础巩固---Daemon线程的创建以及使用场景分析的更多相关文章
- 078 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 03 创建类
078 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 03 创建类 本文知识点:创建类 说明:因为时间紧张,本人写博客过程中只是对知识点的关 ...
- Java 学习笔记之 Daemon线程
Daemon线程: 线程: 用户线程 守护线程 守护线程是一种特殊的线程,在进程中不存在非守护线程了,则守护线程自动销毁. public class DaemonThread extends Thre ...
- Java并发基础05. 传统线程同步通信技术
先看一个问题: 有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次--如此往返执行50次. 看完这个问题,很明显要用到线程间的通信了, 先分析一下思路:首 ...
- 【Java基础】Java类的加载和对象创建流程的详细分析
相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...
- Java类的加载和对象创建流程的详细分析
相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下: package com.test; public ...
- Java并发基础01. 传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- Java并发基础03. 传统线程互斥技术—synchronized
在多个线程同时操作相同资源的时候,就会遇到并发的问题,如银行转账啊.售票系统啊等.为了避免这些问题的出现,我们可以使用synchronized关键字来解决,下面针对synchronized常见的用法做 ...
- Java并发基础02. 传统线程技术中的定时器技术
传统线程技术中有个定时器,定时器的类是Timer,我们使用定时器的目的就是给它安排任务,让它在指定的时间完成任务.所以先来看一下Timer类中的方法(主要看常用的TimerTask()方法): 前面两 ...
- java并发编程 线程基础
java并发编程 线程基础 1. java中的多线程 java是天生多线程的,可以通过启动一个main方法,查看main方法启动的同时有多少线程同时启动 public class OnlyMain { ...
随机推荐
- keepalived脑裂问题
一.对脑裂的理解 在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体.动作协调的HA系统,就分裂成为2个独立的个体.由于相互失去了联系,都以为是对方出了故障.两个节点上的HA软件像 ...
- Eslint常用命令
Eslint常用命令 自动修复(针对整个项目) npm run lint -- --fix 运行如上命令,eslint 会自动修复一些简单的错误. 全局安装 npm install -g eslint ...
- 通过模板创建一个ABP项目
⒈下载 进入ABP模板页面,选择模板后下载 ⒉运行 1.初始化数据库 修改xxxx.Migrator.xxxx.Web.Host appsettings.json中的连接字符串 2.还原数据库 在Nu ...
- php exec执行不等待返回结果
windows中:pclose(popen("start php.exe test.php","r"));lnuix中: pclose(popen(" ...
- 《深入实践C++模板编程》之五——容器与迭代器
1.容器的定义 容器:专门用于某种形式组织及存储数据的类称为“容器”. 2.容器与迭代器 迭代器:封装了对容器虚拟数据序列的操作并按约定提供统一界面以遍历容器内容的代理类即为迭代器. 举例理解 ...
- js修改当前页面地址栏参数
利用HTML5 history新特性replaceState方法可以修改当前页面地址栏参数,示例代码: //选择日期后改变地址栏 var urlSearch = location.href; var ...
- python 获取当前目录下的文件目录和文件名
python 获取当前目录下的文件目录和文件名 os模块下有两个函数: os.walk() os.listdir() 1 # -*- coding: utf-8 -*- 2 3 import os ...
- LeetCode 腾讯精选50题--数组中的第K个最大元素
好吧,不得不承认,书上看到的始终不是自己的,只有亲身时间过才会明白该怎么操作. 找数组中第K个最大元素,简而言之就是先排序,不论使用哪种算法,都需要先排序,确认位置,由于数组可以通过下标直接访问,所以 ...
- Docker 部署mysql、tomcat笔记
Docker 笔记整理 #.环境:Ubuntu 18.* #.安装 mysql 5.6.tomcat #.docker search mysql 报错:Error response from daem ...
- 转:GitHub团队项目合作流程
转自:https://www.cnblogs.com/schaepher/p/4933873.html GitHub团队项目合作流程 已在另一篇博客中写出关于以下问题的解决,点此进入: 同步团队项 ...