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. Tomcat服务部署步骤

    Tomcat服务部署步骤 1. 2. 3. tar -zxvf apache-tomcat-7.0.68.tar.gz,然后修改文件夹名称为需要的名称, 使用mv命令 4. 删除 /webapps/R ...

  2. 个人学习jQuery笔记

    1.$(“#div1”).text()是获取id为div1的文本内容,也可以填充值 $(“#div1”).html() 是获取id 为div1的HTML内容值 也可以填充值 2.$(“#div1”)是 ...

  3. ParentNodes、childNodes、children之间的区别

    "parentNode" 常用来获取某个元素的父节点. 把 parentNodes 理解为容器, 在容器中有个子节点 例: <div id="parent" ...

  4. c# DataTable导出为excel

    /// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <param name="dt& ...

  5. 《利用Python进行数据分析》笔记---第2章--1880-2010年间全美婴儿姓名

    写在前面的话: 实例中的所有数据都是在GitHub上下载的,打包下载即可. 地址是:http://github.com/pydata/pydata-book 还有一定要说明的: 我使用的是Python ...

  6. java作业调度框架Quartz

    在软件开发中,很多时候需要在特定时间的时间执行某些操作,比如每天的凌晨三点.每周的周日.每个月的15号,Apache Quartz就是一个开源的作业调度框架,可以让计划的程序任务一个预定义的日期和时间 ...

  7. Vim技能修炼教程(11) - 代码折叠

    上一讲我们是程序员篇的第一讲,关于代码跳转.代码跳转是一个付出很少收获很大的功能.这一节我们开始一个收获很多,但是付出也相对多一点功能:代码折叠. 代码折叠 折叠的类型 折叠有下面几种类型: * Ma ...

  8. 【机器学习PAI实践十】深度学习Caffe框架实现图像分类的模型训练

    背景 我们在之前的文章中介绍过如何通过PAI内置的TensorFlow框架实验基于Cifar10的图像分类,文章链接:https://yq.aliyun.com/articles/72841.使用Te ...

  9. ss-libev 源码解析local篇(5):ss-local之remote_send_cb

    remote_send_cb这个回调函数的工作是将从客户端收取来的数据转发给ss-server.在之前阅读server_recv_cb代码时可以看到,在STAGE_STREAM阶段有几种可能都会开启r ...

  10. iOS数组的去重,判空,删除元素,删除重复元素 model排序 等

    一: 去重 有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString类型.今天想了想,加上朋友的帮助,想到两种解决办法,先分述如下. 1.利用NSDiction ...