这一章节我们来讨论一下守护线程与非守护线程。

1.什么是守护线程?什么是非守护线程?

非守护线程:Java虚拟机在它全部非守护线程已经离开后自己主动离开。

守护线程:守护线程则是用来服务用户线程的,假设没有其它用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。

2.同样点

大家都是线程。事实上能够互相切换

3.不同点:退出的时间点

退出的先后顺序:

非守护线程->守护线程->jvm

4.注意点:

(1)设置守护线程须要在start之前,否在抛异常

package com.ray.ch17;

public class Test {

	public static void main(String[] args) {
WritePaper writePaper = new WritePaper();
Thread thread = new Thread(writePaper);
thread.start();
thread.setDaemon(true);
}
} class WritePaper implements Runnable {
@Override
public void run() {
System.out.println("run");
}
}

输出:

run
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.setDaemon(Thread.java:1275)
at com.ray.ch17.Test.main(Test.java:9)

(2)由于上面第三点所说的退出时间节点问题。因此会出现以下的情况

package com.ray.ch17;

public class Test {

	public static void main(String[] args) {
WritePaper writePaper = new WritePaper();
Thread thread = new Thread(writePaper);
thread.setDaemon(true);
thread.start();
}
} class WritePaper implements Runnable {
@Override
public void run() {
System.out.println("run");
}
}

输出:

(无)

事实上这里根本就没有运行对应的语句。由于守护线程知道如今没有须要服务的非守护线程(用户自己定义线程),就直接退出了。

假设想运行程序里面的输出。则不要设置守护:

package com.ray.ch17;

public class Test {

	public static void main(String[] args) {
WritePaper writePaper = new WritePaper();
Thread thread = new Thread(writePaper);
thread.start();
}
} class WritePaper implements Runnable {
@Override
public void run() {
System.out.println("run");
}
}

输出:

run

(3)守护线程与非守护线程事实上是没有本质差别,能够相互切换

package com.ray.ch17;

public class Test {

	public static void main(String[] args) {
WritePaper writePaper = new WritePaper();
Thread thread = new Thread(writePaper);
thread.setDaemon(true);
thread.setDaemon(false);
thread.start();
}
} class WritePaper implements Runnable {
@Override
public void run() {
System.out.println("run");
}
}

输出:

run

总结:这一章节主要介绍了守护线程与非守护线程的差别与联系。

这一章节就到这里,谢谢。

-----------------------------------

文件夹

从头认识java-18.2 主要的线程机制(5)-守护线程与非守护线程的更多相关文章

  1. JavaSE中线程与并行API框架学习笔记1——线程是什么?

    前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...

  2. Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...

  3. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面

    目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...

  4. swing线程机制

    在介绍swing线程机制之前,先介绍一些背景概念. 背景概念 同步与异步:     同步是指程序在发起请求后开始处理事件并等待处理的结果或等待请求执行完毕,在此之前程序被阻塞(block)直到请求完成 ...

  5. WPF异常“调用线程无法访问此对象,因为另一个线程拥有该对象 ”

    WPF中在对界面进行操作的时候,可能会遇到"调用线程无法访问此对象,因为另一个线程拥有该对象"异常,这是因为WPF中只有UI线程才能操作UI元素,非UI线程要访问UI时就会报异常了 ...

  6. 线程机制、CLR线程池以及应用程序域

    最近在总结多线程.CLR线程池以及TPL编程实践,重读一遍CLR via C#,比刚上班的时候收获还是很大的.还得要多读书,读好书,同时要多总结,多实践,把技术研究透,使用好. 话不多说,直接上博文吧 ...

  7. python基础-守护进程、守护线程、守护非守护并行

    守护进程 1.守护子进程 主进程创建守护进程  其一:守护进程会在主进程代码执行结束后就终止  其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic pro ...

  8. Java高并发程序设计学习笔记(六):JDK并发包(线程池的基本使用、ForkJoin)

    转自:https://blog.csdn.net/dataiyangu/article/details/86573222 1. 线程池的基本使用1.1. 为什么需要线程池1.2. JDK为我们提供了哪 ...

  9. Java并发1——线程创建、启动、生命周期与线程控制

    内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...

  10. java的守护线程与非守护线程

    最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ,(PS:以 ...

随机推荐

  1. ActiveMQ学习笔记(21)----ActiveMQ集成Tomcat

    1. 监控和管理Broker Web Console 方式:直接访问ActiveMQ的管理页面:http://localhost:8161/admin,默认的用户名和密码是admin/admin.具体 ...

  2. ES6学习笔记(二十二)ArrayBuffer

    ArrayBuffer ArrayBuffer对象.TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口.它们都是以数组的语法处理二进制数据,所以统称为二进 ...

  3. 【Computer Vision】图像单应性变换/投影/仿射/透视

    一.基础概念 1. projective transformation  = homography = collineation. 2. 齐次坐标:使用N+1维坐标来表示N维坐标,例如在2D笛卡尔坐标 ...

  4. sql知识小记

    1.在sql语句中,单引号嵌套时,使用单引号做转义

  5. java几种远程服务调用协议的比较

    原文地址:http://www.cnblogs.com/jifeng/archive/2011/07/20/2111183.html 一.综述 本文比较了RMI,Hessian,Burlap,Http ...

  6. makefile--回顾基础篇

    前阵子让写makefile,纠结了下,基本忘记差不多了. 1.gcc的编译选项 -c 只是编译不链接,生成目标文件“.o” -S 只是编译不汇编,生成汇编代码 -E 只进行预编译,不做其他处理 -g ...

  7. 使用AFNetworking第三方下载类

    AFNetworking 眼下使用比較多得一个下载库 眼下一直在维护更新,使用的是很easy 不须要加入不论什么关联的库  1.带block形式 内部是任务队列进行下载  就是对operation的一 ...

  8. d堆

    就是d叉堆,是二叉堆的简单推广(http://blog.csdn.net/buleriver/article/details/38469907) 对于一个d堆.也是能够使用数组表示.关键是怎样通过索引 ...

  9. 自己封装js组件 - 中级中高级

    接着做关于alert组件的笔记 怎么又出来个中高级呢 对没错 就是出一个中高级来刷流量呵呵呵,但是中高级也不是白叫的 这次主要是增加了widget类,增加了自己绑定的事件和触发事件的方法!这么做是为什 ...

  10. ThinkPHP5中find()和select()区别

    ThinkPHP5中find()和select()区别 读取数据是指读取数据表中的一行数据(或者关联数据),主要通过find方法完成,例如: 1 2 3 4 $User = M("User& ...