java线程是一个运用很广泛的重点知识,我们很有必要了解java的daemon线程.

1.首先我们必须清楚的认识到java的线程分为两类: 用户线程和daemon线程

  A.  用户线程: 用户线程可以简单的理解为用户定义的线程,当然包括main线程(以前我错误的认为main线程也是一个daemon线程,但是慢慢的发现原来main线程不是,因为如果我再main线程中创建一个用户线程,并且打出日志,我们会发现这样一个问题,main线程运行结束了,但是我们的线程任然在运行).

  B.  daemon线程: daemon线程是为我们创建的用户线程提供服务的线程,比如说jvm的GC等等,这样的线程有一个非常明显的特征: 当用户线程运行结束的时候,daemon线程将会自动退出.(由此我们可以推出下面关于daemon线程的几条基本特点)

2. daemon 线程的特点:

  A.  守护线程创建的过程中需要先调用setDaemon方法进行设置,然后再启动线程.否则会报出IllegalThreadStateException异常.(个人在想一个问题,为什么不能动态更改线程为daemon线程?有时间一个补上这个内容,现在给出一个猜测: 是因为jvm判断线程状态的时候,如果当前只存在一个线程Thread1,如果我们把这个线程动态更改为daemon线程,jvm会认为当前已经不存在用户线程而退出,稍后将会给出正确结论,抱歉!如果有哪位大牛看到,希望给出指点,谢谢!)

  B.  由于daemon线程的终止条件是当前是否存在用户线程,所以我们不能指派daemon线程来进行一些业务操作,而只能服务用户线程.

  C.  daemon线程创建的子线程任然是daemon线程.

3. 针对上面给出的daemon线程的特点,我们进行如下验证:

  A.  对应上面的A特点:

  1. public class ThreadTest {
  2. public static void main(String[] args) throws InterruptedException {
  3. Thread thread1 = new Thread(new Thread2());
  4. thread1.start();
  5. thread1.setDaemon(true);
  6. Thread.sleep(10);
  7. System.out.println("用户线程退出");
  8. }
  9. }
  10. class Thread2 implements Runnable{
  11. @Override
  12. public void run() {
  13. try {
  14. Thread.sleep(1000);
  15. System.out.println("1+1="+(1+1));
  16. } catch (InterruptedException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. }
  20. }
  21. }
  22. 运行结果:
  23. Exception in thread "main" java.lang.IllegalThreadStateException
  24. at java.lang.Thread.setDaemon(Thread.java:1352)
  25. at ThreadTest.main(ThreadTest.java:5)
  26. 1+1=2

  通过上面的例子我们可以发现,我们并不能动态的更改线程为daemon线程,源码解释如下:

  1. java源码:
  2. public final void setDaemon(boolean on) {
  3. checkAccess();
  4. if (isAlive()) {
  5. throw new IllegalThreadStateException();
  6. }
  7. daemon = on;
  8. }

  我们可以发现,在源码中如果我们的线程状态是alive的,我们的程序就会抛出异常.

  B.对应上面的B特点:

  

  1. public class ThreadTest {
  2. public static void main(String[] args) throws InterruptedException {
  3. Thread thread1 = new Thread(new Thread2());
  4. thread1.setDaemon(true);
  5. thread1.start();
  6. Thread.sleep(10);
  7. System.out.println("用户线程退出");
  8. }
  9. }
  10. class Thread2 implements Runnable{
  11. @Override
  12. public void run() {
  13. try {
  14. Thread.sleep(1000);
  15. System.out.println("1+1="+(1+1));
  16. } catch (InterruptedException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. }
  20. }
  21. }
  22.  
  23. 运行结果: 用户线程退出

  通过上面的例子我们可以看到,我们在daemon线程中进行相关的计算工作,但是我们并没有获取计算结果,因为用户线程main已经运行结束.

  C.对应上面的C特点:

  

  1. public class ThreadTest {
  2. public static void main(String[] args) throws InterruptedException {
  3. Thread thread = new Thread(new Thread2());
  4. thread.setDaemon(true);
  5. thread.start();
  6. System.out.println("Thread是否时daemon线程"+thread.isDaemon());
  7. Thread.sleep(100);
  8. System.out.println("用户线程退出");
  9. }
  10. }
  11. class Thread2 implements Runnable{
  12. @Override
  13. public void run() {
  14. Thread1 thread1 = new Thread1();
  15. thread1.start();
  16. System.out.println("Thread1是否是daemon线程"+thread1.isDaemon());
  17. }
  18. }
  19. class Thread1 extends Thread{
  20. public void run () {
  21. System.out.println("dosomething");
  22. }
  23. }
  24. 运行结果:
  25. Thread是否时daemon线程true
  26. Thread1是否是daemon线程true
  27. dosomething
  28. 用户线程退出

  源码解析:

  1. private void init(ThreadGroup g, Runnable target, String name,
  2. long stackSize, AccessControlContext acc) {
  3. ......
  4. this.daemon = parent.isDaemon();
  5. this.priority = parent.getPriority();
  6. ......
  7. }

  在进行Thread初始化的时候,会获取父进程的isDaemon来复制子进程的daemon.

java线程基础知识----java daemon线程的更多相关文章

  1. java线程基础知识----java线程模型

    转载自http://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html 1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标 ...

  2. java复习基础知识——java保留字

    ava 关键字列表 (依字母排序 共51组): abstract, assert,boolean, break, byte, case, catch, char, class, const, cont ...

  3. Java 多线程——基础知识

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  4. Java__线程---基础知识全面实战---坦克大战系列为例

    今天想将自己去年自己编写的坦克大战的代码与大家分享一下,主要面向学习过java但对java运用并不是很熟悉的同学,该编程代码基本上涉及了java基础知识的各个方面,大家可以通过练习该程序对自己的jav ...

  5. Java多线程基础:进程和线程之由来

    转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...

  6. Java并发基础:进程和线程之由来

    转载自:http://www.cnblogs.com/dolphin0520/p/3910667.html 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程. ...

  7. 1、Java多线程基础:进程和线程之由来

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

  8. Java 多线程基础(四)线程安全

    Java 多线程基础(四)线程安全 在多线程环境下,如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线 ...

  9. Java 多线程基础(五)线程同步

    Java 多线程基础(五)线程同步 当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题. 要解决上述多线程并发访问一个资源的安全性问题,Java中提供了同步机制 ...

随机推荐

  1. windows下安装pywin32报错:close failed in file object destructor:sys.excepthook is missing lost sys.stderr

    今晚要写搜索引擎作业,搭scrapy环境,遇到了下面问题: windows下安装pywin32报错:close failed in file object destructor:sys.excepth ...

  2. win2008server R2 x64 部署.net core到IIS

    1.下载sdk 和.NET Core Windows Server Hosting   https://www.microsoft.com/net/download  2.出现HTTP 错误 500. ...

  3. Saiku_学习_03_Saiku+Kylin构建多维分析OLAP平台

    一.技术选型 参见:Saiku+Kylin多维分析平台探索 1.saiku Saiku 作为分析平台,提供可视化的操作,能方便的对数据进行查询.分析,并提供图形化显示 2.kylin Kylin 作为 ...

  4. 如何在Android开发中测试应用在真机上实验

    1.首先将手机设置为调试模式 方法:设置——应用程序——开发——USB调试,打上√即可     2.用数据线连接至电脑   3.然后打开eclipse 右击点击工程,选择 Run as,再选择Run ...

  5. 3.1 第一个场景 HelloWorldScene

    HelloWorldScene.h #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos ...

  6. 小米5安装Xposed框架——需要解锁刷机

    Xposed官网 https://forum.xda-developers.com/xposed 官方模块厂库 https://repo.xposed.info/ 中文站点 https://xpose ...

  7. noip2017列队(线段树)

    维护一个方阵,支持 1.删掉一个点,剩下的点先向左看齐再向前看齐 2.询问一个位置上是哪个点 $n,m,q \leq 3 \times 10^5$ sol: 我们每行前$m-1$列维护一个线段树,最后 ...

  8. Operating System-Thread(2) Multi-Process-Parallel vs Multi-Thread-Parallel

    本文主要介绍线程的模型 一.Multi-Process-Parallel vs Multi-Thread-Parallel 多进程的并行:CPU在多个进程之间进行切换,系统给人一种多个进程在并行执行的 ...

  9. C++STL库中vector容器常用应用

    #include<iostream> #include<vector> #include<algorithm> using namespace std; int m ...

  10. Python:struct模块的pack、unpack

    mport struct pack.unpack.pack_into.unpack_from 1 # ref: http://blog.csdn<a href="http://lib. ...