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. Android Studio 3.0 及个版本下载和 gradle 各版本下载

    Android Studio 3.0 下载地址: 链接:http://pan.baidu.com/s/1jHVuOQi 密码:3pd0 Android Studio 3.0 包含了三大主要功能: 一套 ...

  2. 设计模式--迭代器模式C++实现

    迭代器模式C++实现 1定义 他提供一种方法访问一个容器对象中的各个元素,而不暴漏该对象内部细节 注:迭代器是为容器服务的.迭代器模式提供了遍历容器的方便性,容器只管理增减元素就好,需要遍历时交给迭代 ...

  3. torch 深度学习(4)

    torch 深度学习(4) test doall files 经过数据的预处理.模型创建.损失函数定义以及模型的训练,现在可以使用训练好的模型对测试集进行测试了.测试模块比训练模块简单的多,只需调用模 ...

  4. 020——VUE中变异方法push的留言版实例讲解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. C++复习3.C/C++常量的知识

    C/C++常量的知识 20130918 语言的实现隐含着使用着一些常量,如初始化全局变量静态变量,另外还有一些我们不曾感觉到的变量:函数地址(也就是函数名称), 静态数组的名字,字符串常亮的地址.常量 ...

  6. qml 源码样例

    https://github.com/CodeBees/qtExample https://github.com/zhengtianzuo/QtQuickExamples/blob/master/RE ...

  7. ET之快递测试法学习感悟20140922

    快递测试法,是从ET学习中了解到的一种测试方法,顾名思义就是数据类似于那些通过联邦快递系统在这个星球上被不断移动的包裹一样,在软件中也不断的流动.数据从被输入后就开始了它的生命周期,先被存储在内部变量 ...

  8. oracle 查询XML操作、操作系统文件

    --1.随机数 select dbms_random.value from dual; select mod(dbms_random.random, 10) from dual; --0-9随机数 s ...

  9. iOS GCD之dispatch_semaphore(信号量)

    前言 最近在看AFNetworking3.0源码时,注意到在 AFURLSessionManager.m 里面的 tasksForKeyPath: 方法 (L681),dispatch_semapho ...

  10. stack组件03

    继昨天留下的问题 思路: 结果: 优化: from stark.service.site import site,ModelSatrk from .models import * from djang ...