【java多线程】用户线程和守护线程的区别
java中线程分为两种类型:用户线程和守护线程。通过Thread.setDaemon(false)设置为用户线程;通过Thread.setDaemon(true)设置为守护线程。如果不设置次属性,默认为用户线程。
用户线程和守护线程的区别:
1. 主线程结束后用户线程还会继续运行,JVM存活;主线程结束后守护线程和JVM的状态又下面第2条确定。
2.如果没有用户线程,都是守护线程,那么JVM结束(随之而来的是所有的一切烟消云散,包括所有的守护线程)。
补充说明:
定义:守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开。
优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
设置:通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为守护线程的方式是在线程启动用线程对象的setDaemon方法。
example: 垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程 是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
生命周期:守护进程(Daemon)是运行在后台的一 种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。 那Java的守护线程是什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。
用户线程和守护线程的测试案例:
package com.sxf.test.thread; import java.util.Date; /**
* 测试用户线程和守护线程的区别
* @author sxf
*
*/
public class DaemonThreadTest { public static void main(String[] args) {
//测试守护线程
//testDaemonThread();
//测试用户线程
testUserThread();
//主线程休眠5秒后退出
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("DaemonThreadTest.main()主线程退出");
} /**
* 测试守护线程结果:
*I'm running at Tue Dec 26 16:37:32 CST 2017, I am daemon
*I'm running at Tue Dec 26 16:37:33 CST 2017, I am daemon
*I'm running at Tue Dec 26 16:37:34 CST 2017, I am daemon
*I'm running at Tue Dec 26 16:37:35 CST 2017, I am daemon
*I'm running at Tue Dec 26 16:37:36 CST 2017, I am daemon
*DaemonThreadTest.main()主线程退出
*/
public static void testDaemonThread(){
DaemonThead t=new DaemonThead();
Thread thread=new Thread(t);
thread.setDaemon(true);//将当前线程设置为守护线程
thread.start();//启动当前线程
} /**
* 测试用户线程结果:
* I'm running at Tue Dec 26 16:41:37 CST 2017, I am not daemon
*I'm running at Tue Dec 26 16:41:38 CST 2017, I am not daemon
*I'm running at Tue Dec 26 16:41:39 CST 2017, I am not daemon
*I'm running at Tue Dec 26 16:41:40 CST 2017, I am not daemon
*I'm running at Tue Dec 26 16:41:41 CST 2017, I am not daemon
*DaemonThreadTest.main()主线程退出
*I'm running at Tue Dec 26 16:41:42 CST 2017, I am not daemon
*I'm running at Tue Dec 26 16:41:43 CST 2017, I am not daemon
*I'm running at Tue Dec 26 16:41:44 CST 2017, I am not daemon
*I'm running at Tue Dec 26 16:41:45 CST 2017, I am not daemon
*I'm running at Tue Dec 26 16:41:46 CST 2017, I am not daemon
*I'm running at Tue Dec 26 16:41:47 CST 2017, I am not daemon
*/
public static void testUserThread(){
UserThead u=new UserThead();
Thread userThread=new Thread(u);
userThread.setDaemon(false);//可不用设置,默认为用户线程
userThread.start();
}
} /**
* 守护线程
* @author sxf
*
*/
class DaemonThead implements Runnable{ @Override
public void run() {
String daemon = (Thread.currentThread().isDaemon() ? "daemon": "not daemon");
while (true) {
System.out.println("I'm running at " + new Date() + ", I am " + daemon);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("I was interrupt, I am " + daemon);
}
}
} } /**
* 用户线程
* @author sxf
*
*/
class UserThead implements Runnable{ @Override
public void run() {
String daemon = (Thread.currentThread().isDaemon() ? "daemon": "not daemon");
while (true) {
System.out.println("I'm running at " + new Date() + ", I am " + daemon);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("I was interrupt, I am " + daemon);
}
} } }
【java多线程】用户线程和守护线程的区别的更多相关文章
- (Java多线程系列五)守护线程
守护线程 什么是守护线程 Java中有两种线程,一种是用户线程,一种是守护线程. 当进程不存在或主线程停止,守护线程也会自动停止. class DaemonThread extends Thread ...
- Java用户线程和守护线程
今天看Java一个关于多线程返回值方式的示例,发现一个自己不太能理解的问题,就是在主线程中启动了几个工作线程,主线程中也没有join,工作线程居然也是正常输出了回调的结果.这个跟linux C++下的 ...
- Java 多线程基础(十一)线程优先级和守护线程
Java 多线程基础(十一)线程优先级和守护线程 一.线程优先级 Java 提供了一个线程调度器来监控程序启动后进去就绪状态的所有线程.线程调度器通过线程的优先级来决定调度哪些线程执行.一般来说,Ja ...
- Java:多线程<四> Lock、停止线程、守护线程、join、优先级&yield
Java1.5以后,Condition将Object监视器方法(wait, notify, notifyAll)分解成截然不同的对象,以便通过这些对象与任意Lock实现组合使用为每个对像提供多个等待s ...
- Java多线程系列 基础篇03 线程的优先级和守护线程
1. 线程优先级 现代操作系统中基本上使用时间分片的方式调度线程,通过设置线程优先级,使优先级高的线程获得时间片的次数多于优先级低的线程. 在java 线程中,通过一个整形变量prority来控制优先 ...
- java高并发系列 - 第9天:用户线程和守护线程
守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程.JIT线程都是守护线程.与之对应的是用户线程,用户线程可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作.如果 ...
- java 用户线程和守护线程
在Java中通常有两种线程:用户线程和守护线程(也被称为服务线程)通过Thread.setDaemon(false)设置为用户线程通过Thread.setDaemon(true)设置为守护线程线程属性 ...
- 进程?线程?多线程?同步?异步?守护线程?非守护线程(用户线程)?线程的几种状态?多线程中的方法join()?
1.进程?线程?多线程? 进程就是正在运行的程序,他是线程的集合. 线程是正在独立运行的一条执行路径. 多线程是为了提高程序的执行效率.2.同步?异步? 同步: 单线程 异步: 多线程 3.守护线程? ...
- java并发:初探用户线程和守护线程
用户线程和守护线程 用户线程 用户线程执行完,jvm退出.守护线程还是可以跑的 /** * A <i>thread</i> is a thread of execution i ...
随机推荐
- mysql数据库优化课程---13、mysql基础操作
mysql数据库优化课程---13.mysql基础操作 一.总结 一句话总结:mysql复制表,索引,视图 1.mysql如何复制表? like select * 1.复制表结构 create tab ...
- ActiveMQ消息队列使用和配置
安装ActiveMQ 使用brew安装https://blog.csdn.net/u010046908/article/details/54728375 直接下载安装https://blog.csdn ...
- idea Controller层编译Mapper层报错
解决方案:ctrl+alt+s 搜索insp 设置spring的编译Error改为Warning就可以了
- vue-router防跳墙控制
vue-router防跳墙控制 因为在实际开发中,从自己的角度来看,发现可以通过地址栏输入地址,便可以进入本没有权限的网页.而我们一般只是操作登录页面,其他页面很少考虑,此刻特来尝试解决一下 基于vu ...
- python decorator 装饰器
python装饰器是个对嵌套函数的语法糖 作用是在函数调用方法不变的情况下,将函数包装成另一个函数来使用 ---- import time def sum1(): sum = 1 + 2 print ...
- Django中类视图使用装饰器的方式
类视图使用装饰器 为类视图添加装饰器,可以使用两种方法. 为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),及一个要被装饰的类视图. def ...
- igmpproxy源代码学习——igmpProxyInit()
igmpproxy源代码学习--igmpProxyInit()函数详解,igmpproxy初始化 在运行igmpproxy的主程序igmpproxyRun()之前需要对igmpproxy进行一些配置, ...
- L148
You don't know about real loss, because that only occurs when you love something more than you love ...
- Python的介绍及Pycharm软件的安装
一.Python介绍 1. Python是一种解释性.面向对象.动态数据类型的高级程序设计语言. Python语言创始人是吉多.范罗苏姆:起源与1989年 2. 缺点:运行速度慢(由于是解释性语言 ...
- 在IE中MVC控制器中返回JSON格式的数据时提示下载
最近做项目时,视图中用jquery.form.js异步提交表单时,接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如 ...