Java中的守护线程
守护线程的概念
在java中有两种线程,守护线程和非守护线程,其两者并没有本质的区别,唯一的区别就是当前的用户线程退出的时候,若只存在唯一的A线程,若A线程为守护线程,那么JVM将会直接退出,否则JVM不会退出而是等待A线程执行完成后退出.
如何创建守护线程
这里我们创建一个基本的需求,在Main线程中其中一个线程A,我们分别设置A线程是守护线程和非守护线程,来观察执行的结果.
设置一个线程为守护线程则非常的简单,只要在线程启动之前,也就是调用其start()方法之前,调用其setDaemon方法即可. 其方法定义如下:
通过分析这部分的源码可以看到,设置的daemon的时候首先会调用checkAccess()方法,这个方法会检查当前线程是否能被修改,也就是是否已经启动,如果已经启动,再调用setDaemon()方法的话,那么就会抛出IllegalThreadStateException,这也是为什么必须在start()方法调用之前设置的原因.
可以看到线程最后设置daemon变量为on,那么跟踪daemon变量,其定义为默认为false级非守护线程
/* Whether or not the thread is a daemon thread. */
private boolean daemon = false;
/**
* Marks this thread as either a {@linkplain #isDaemon daemon} thread
* or a user thread. The Java Virtual Machine exits when the only
* threads running are all daemon threads.
*
* <p> This method must be invoked before the thread is started.
*
* @param on
* if {@code true}, marks this thread as a daemon thread
*
* @throws IllegalThreadStateException
* if this thread is {@linkplain #isAlive alive}
*
* @throws SecurityException
* if {@link #checkAccess} determines that the current
* thread cannot modify this thread
*/
public final void setDaemon(boolean on) {
checkAccess();
if (isAlive()) {
throw new IllegalThreadStateException();
}
daemon = on;
}
创建示例代码
package com.zhoutao.demo.thread;
import java.util.concurrent.TimeUnit;
/** 守护线程 */
public class DaemonThread {
public static void main(String[] args) {
Thread thread =
new Thread() {
@Override
public void run() {
while (true) {
try {
System.out.println("exec sub thread....");
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
// 设置参数修改为true 或者 false
// 若设置为守护线程,那么当钱线程组不存在activeThread的线程的时候,程序将退出
thread.setDaemon(false);
thread.start();
System.out.println("Main线程已经执行完成");
}
}
这里通过 thread.setDaemon(true); 将线程设置为了非守护线程,当Main主线程执行完成的时候,子线程thread会继续执行,每隔1s中打印exec sub thread....,执行结果如下:
线程已经执行完成
exec sub thread....
exec sub thread....
exec sub thread....
exec sub thread....
exec sub thread....
这里则验证因为还存在非守护线程,所以JVM不会退出,会继续执行下去
下面我们设置该线程为守护线程,其结果为
线程已经执行完成
exec sub thread....
Process finished with exit code 0
可以明确的看到现成的退出code=0,说明当Main执行完成之后,JVM中并不存在非守护线程,所以JVM直接退出了
说明
由于我们并不知道线程组(ThreadGroup) 中的其他线程情况,因此我们也无法确定到JVM什么时候会退出,所以在守护线程中读写文件,进行IO操作或者其他持久化操作并不合理,这里需要注意下
Java中的守护线程的更多相关文章
- Java中的守护线程 & 非守护线程(简介)
Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...
- Java中的守护线程和非守护线程(转载)
<什么是守护线程,什么是非守护线程> Java有两种Thread:"守护线程Daemon"(守护线程)与"用户线程User"(非守护线程). 用户线 ...
- (转)Java中的守护线程
Java的守护线程与非守护线程 守护线程与非守护线程 最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户线程和守护线程 所谓守护 ...
- Java中的守护线程——daemon
絮叨 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 定义:守护线程(aka:服务线程),在没有用户线程可服务时会自动离开. 优先级:守护线程的优先级 ...
- java多线程之守护线程与非守护线程
在java线程中有两种线程,一种是用户线程,其余一种是守护线程. 守护线程具有特殊的含义,比如gc线程.当最后一个非守护线程执行完后,守护线程随着jvm一同结束工作. java中的守护线程需要将Dae ...
- Java多线程之守护线程
Java多线程之守护线程 一.前言 Java线程有两类: 用户线程:运行在前台,执行具体的任务,程序的主线程,连接网络的子线程等都是用户线程 守护线程:运行在后台,为其他前台线程服务 特点:一旦所有用 ...
- Java中如何创建线程
Java中如何创建线程 两种方式:1)继承Thread类:2)实现Runnable接口. 1.继承Thread类 继承Thread类,重写run方法,在run方法中定义需要执行的任务. class M ...
- Java daemon thread 守护线程
守护线程与普通线程写法上基本么啥区别,在启动线程前, 调用线程对象的方法setDaemon(true),则可以将其设置为守护线程. 守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收.内存 ...
- java多线程之守护线程以及Join方法
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.守护线程概述及示例 守护线程就是为其它线程提供"守护"作用,说白了就是为其它线程服务的,比如GC线程. java程序中线程分 ...
随机推荐
- 深入理解令牌认证机制(token)
以前的开发模式是以MVC为主,但是随着互联网行业快速的发展逐渐的演变成了前后端分离,若项目中需要做登录的话,那么token成为前后端唯一的一个凭证. token即标志.记号的意思,在IT领域也叫作令牌 ...
- .net mvc + layui做图片上传(一)
图片上传和展示是互联网应用中比较常见的一个功能,最近做的一个门户网站项目就有多个需要上传图片的功能模块.关于这部分内容,本来功能不复杂,但后面做起来却还是出现了一些波折.因为缺乏经验,对几种图片上传的 ...
- 01 Java jdk环境配置
1.1 书籍(B) [1] java核心技术 [2] 实战java 1.2 网址(B) oracle.com http://www.ibm.com/developerWorks/cn/ https:/ ...
- 18 章 CSS 链接、光标、 DHTML 、缩放
1.CSS 中链接的使用 2.CSS 中光标的使用 3.CSS 中 DHTML 的使用 4.CSS 中缩放的使用 1 18 8. .1 1 S CSS 中 链接的使用 超链接伪类属性 a:link ...
- Android调试神器stetho使用详解和改造
本文由云+社区发表 作者:NaOH 概述 stetho是Facebook开源的一个Android调试工具,项目地址:facebook/stetho 通过Stetho,开发者可以使用chrome的ins ...
- 章节八、3-如何用Chrome开发者工具查看元素
一.如何使用开发者工具,操作步骤与火狐浏览器一致(此处不重复叙述,此处主要描述如何查找元素是否存在以及元素在页面中是否重复). 1.打开开发者选项,然后按“ctrl+f”,会出现一个输入框在输入框中输 ...
- Windows Server 2012 R2安装Oracle 11g问题
1.[INS-13001]环境不满足最低要求 如图: oracle11g早于Windows Server 2012 R2 解决方法:找到解压目录../win64_11gR2_database\ ...
- GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解
Group By Group By 谁不会啊?这不是最简单的吗?越是简单的东西,我们越会忽略掉他,因为我们不愿意再去深入了解它. 1 小时 SQL 极速入门(一) 1 小时 SQL 极速入门(二) 1 ...
- ubuntu-18.04 设置开机启动脚本-亲测有效
ubuntu-18.04不能像ubuntu14一样通过编辑rc.local来设置开机启动脚本,通过下列简单设置后,可以使rc.local重新发挥作用. 2.将下列内容复制进rc-local.servi ...
- Docker & ASP.NET Core (3):发布镜像
第一篇:把代码连接到容器 第二篇:定制Docker镜像 上一篇文章最后有个问题,定制的镜像无法正常运行: 这可能是由于无法找到要运行的dll引起的问题. 之前的Dockerfile的文档我是按照微软的 ...