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多线程】用户线程和守护线程的区别的更多相关文章

  1. (Java多线程系列五)守护线程

    守护线程 什么是守护线程 Java中有两种线程,一种是用户线程,一种是守护线程. 当进程不存在或主线程停止,守护线程也会自动停止. class DaemonThread extends Thread ...

  2. Java用户线程和守护线程

    今天看Java一个关于多线程返回值方式的示例,发现一个自己不太能理解的问题,就是在主线程中启动了几个工作线程,主线程中也没有join,工作线程居然也是正常输出了回调的结果.这个跟linux C++下的 ...

  3. Java 多线程基础(十一)线程优先级和守护线程

    Java 多线程基础(十一)线程优先级和守护线程 一.线程优先级 Java 提供了一个线程调度器来监控程序启动后进去就绪状态的所有线程.线程调度器通过线程的优先级来决定调度哪些线程执行.一般来说,Ja ...

  4. Java:多线程<四> Lock、停止线程、守护线程、join、优先级&yield

    Java1.5以后,Condition将Object监视器方法(wait, notify, notifyAll)分解成截然不同的对象,以便通过这些对象与任意Lock实现组合使用为每个对像提供多个等待s ...

  5. Java多线程系列 基础篇03 线程的优先级和守护线程

    1. 线程优先级 现代操作系统中基本上使用时间分片的方式调度线程,通过设置线程优先级,使优先级高的线程获得时间片的次数多于优先级低的线程. 在java 线程中,通过一个整形变量prority来控制优先 ...

  6. java高并发系列 - 第9天:用户线程和守护线程

    守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程.JIT线程都是守护线程.与之对应的是用户线程,用户线程可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作.如果 ...

  7. java 用户线程和守护线程

    在Java中通常有两种线程:用户线程和守护线程(也被称为服务线程)通过Thread.setDaemon(false)设置为用户线程通过Thread.setDaemon(true)设置为守护线程线程属性 ...

  8. 进程?线程?多线程?同步?异步?守护线程?非守护线程(用户线程)?线程的几种状态?多线程中的方法join()?

    1.进程?线程?多线程? 进程就是正在运行的程序,他是线程的集合. 线程是正在独立运行的一条执行路径. 多线程是为了提高程序的执行效率.2.同步?异步? 同步: 单线程 异步: 多线程 3.守护线程? ...

  9. java并发:初探用户线程和守护线程

    用户线程和守护线程 用户线程 用户线程执行完,jvm退出.守护线程还是可以跑的 /** * A <i>thread</i> is a thread of execution i ...

随机推荐

  1. spring mvc:视图解析器

    ModelAndView对象中的view对象,可以使用字符串来让Spring框架进行解析获得适合的视图.而解析View的就是ViewResolver技术. ViewResolver的定义如下: pub ...

  2. 1004: [HNOI2008]Cards burnside定理

    https://www.lydsy.com/JudgeOnline/problem.php?id=1004 输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种洗牌法,都存在一种洗牌法使 ...

  3. bzoj 1087 状压dp

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4130  Solved: 2390[Submit][ ...

  4. JS返回一个数据的千分位格式

    /** * 价钱转换-从右往左每3位数字加一个逗号 * @param price 需要转换的价格 */ formatPrice(price){ var newPrice = price.split(' ...

  5. MySQL相关问题总结

    希望此贴能够将MySQL安装周围的问题总结清楚,也免得自己再遇到问题时而不知所措.本帖中所有关于MySQL的问题均涉及到两个平台:Ubuntu 和 Windows(本人没有Mac) 问题1:MySQL ...

  6. centos 7安装jenkins

    1. 安装java yum install java 2. 安装jenkins wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci. ...

  7. 禁用iPhone手机浏览器上给电话号码自动加上的link样式(苹果手机自动给手机号加样式)

    原文地址:http://blog.csdn.net/atec2000/article/details/44631633 iPhone手机上的浏览器(如Safari),在解析网页的时候会自动给 像是电话 ...

  8. Python基本常用算法

    什么是算法 就是一个计算的过程,解决问题的方法 用到知识点 递归 调用自身 有结束条件 下次执行相应的复杂度要减少 时间复杂度排序(按效率排序) O(1)<O(logn)<O(n)< ...

  9. java反射抄的例子

    package com.reflect; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /* * 反射的概念 * ...

  10. MAC 下安装 SVN

    在mac下安装svn走了很多弯路,进过探索,现在对svn的安装做了总结,可以分为2种: 1.由于 xCode自带svn,所以可以安装xCode 1).打开App Store,搜索xCode,下载安装 ...