• 什么是后台(守护)线程?


    所谓的后台(daemon)线程,也叫守护线程,是指程序在运行的时候,在后台提供一种通用服务的线程(例如:守护线程GC),并且,这种线程并不属于程序中不可或缺的部分;因此当所有的非后台线程结束时,程序也就终止了,同时杀死所有的后台线程。相反,只要有任何非后台线程(例如:非守护线程main())还存在,程序就不会终止。后台线程具有最低的优先级。

    setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,默认(false)为User模式。setDaemon(boolean on)方法必须在线程启动(start())之前调用,当线程正在运行时调用会产生异常。

    isDaemon方法将测试该线程是否为守护线程。注意:当你在一个守护线程中产生了其他线程,那么这些新产生的线程不用设置Daemon属性,都将是守护线程,用户线程同样。  

    守护线程与普通线程的唯一区别是:守护线程就是main同生共死,当main退出,它将终止而普通线程是在任务执行结束才停止

    普通线程代码:

     1 package com.mianshi.easy;
     2 public class StartRunTest {
     3     /**
     4      * 后台(守护)线程实验
     5      */
     6     public static void main(String[] args){
     7         Thread thread=new ThreadDemo();
     8 
     9         //1、为什么没有打印出100句呢?因为我们将thread线程设置为了daemon(守护)线程,程序中只有守护线程存在的时候,是可以退出的,所以只打印了七句便退出了
    10         //2、当java虚拟机中有守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,
    11         //守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底会出现什么问题
    12         //thread.setDaemon(true);
    13         thread.start();
    14     }
    15     
    16     public static class ThreadDemo extends Thread{
    17         @Override
    18         public void run() {
    19             for (int i = 0; i < 100; i++) {
    20                 System.out.println("This is a Thread test"+i);
    21             }
    22         }
    23     }
    24 }
    View Code

    结果:

    This is a Thread test0
    This is a Thread test1
    This is a Thread test2
    This is a Thread test3
    This is a Thread test4
    This is a Thread test5
    This is a Thread test6
    This is a Thread test7
    This is a Thread test8
    This is a Thread test9
    This is a Thread test10
    This is a Thread test11
    This is a Thread test12
    This is a Thread test13
    This is a Thread test14
    This is a Thread test15
    This is a Thread test16
    This is a Thread test17
    This is a Thread test18
    This is a Thread test19
    This is a Thread test20
    This is a Thread test21
    This is a Thread test22
    This is a Thread test23
    This is a Thread test24
    This is a Thread test25
    This is a Thread test26
    This is a Thread test27
    This is a Thread test28
    This is a Thread test29
    This is a Thread test30
    This is a Thread test31
    This is a Thread test32
    This is a Thread test33
    This is a Thread test34
    This is a Thread test35
    This is a Thread test36
    This is a Thread test37
    This is a Thread test38
    This is a Thread test39
    This is a Thread test40
    This is a Thread test41
    This is a Thread test42
    This is a Thread test43
    This is a Thread test44
    This is a Thread test45
    This is a Thread test46
    This is a Thread test47
    This is a Thread test48
    This is a Thread test49
    This is a Thread test50
    This is a Thread test51
    This is a Thread test52
    This is a Thread test53
    This is a Thread test54
    This is a Thread test55
    This is a Thread test56
    This is a Thread test57
    This is a Thread test58
    This is a Thread test59
    This is a Thread test60
    This is a Thread test61
    This is a Thread test62
    This is a Thread test63
    This is a Thread test64
    This is a Thread test65
    This is a Thread test66
    This is a Thread test67
    This is a Thread test68
    This is a Thread test69
    This is a Thread test70
    This is a Thread test71
    This is a Thread test72
    This is a Thread test73
    This is a Thread test74
    This is a Thread test75
    This is a Thread test76
    This is a Thread test77
    This is a Thread test78
    This is a Thread test79
    This is a Thread test80
    This is a Thread test81
    This is a Thread test82
    This is a Thread test83
    This is a Thread test84
    This is a Thread test85
    This is a Thread test86
    This is a Thread test87
    This is a Thread test88
    This is a Thread test89
    This is a Thread test90
    This is a Thread test91
    This is a Thread test92
    This is a Thread test93
    This is a Thread test94
    This is a Thread test95
    This is a Thread test96
    This is a Thread test97
    This is a Thread test98
    This is a Thread test99
    View Code

    可见,在主线程中启动了默认的普通线程,此后主线程没有任何的执行语句,开始等待子线程执行,子线程得到CPU执行权后,开始执行run()方法,打印完100句话后,线程执行完成并终止,此时,主线程也会结束。程序中所有的非守护线程执行完成,程序结束。

    守护线程代码:

     1 package com.mianshi.easy;
     2 public class StartRunTest {
     3     /**
     4      * 后台(守护)线程实验
     5      */
     6     public static void main(String[] args){
     7         Thread thread=new ThreadDemo();
     8 
     9         //1、为什么没有打印出100句呢?因为我们将thread线程设置为了daemon(守护)线程,程序中只有守护线程存在的时候,是可以退出的,所以只打印了七句便退出了
    10         //2、当java虚拟机中有守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,
    11         //守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底会出现什么问题
    12         thread.setDaemon(true);
    13         thread.start();
    14     }
    15     
    16     public static class ThreadDemo extends Thread{
    17         @Override
    18         public void run() {
    19             for (int i = 0; i < 100; i++) {
    20                 System.out.println("This is a Thread test"+i);
    21             }
    22         }
    23     }
    24 }
    View Code

    结果:

    1       
    View Code

    此时,进入主线程,创建了一个线程,随后将它设置为后台线程,并调用start()方法,使子线程就绪,但此时,程序中没有任何非后台线程,所以,主线程可以结束,程序也会停止。

  • 相关阅读:
    软件工程课件
    团队博客作业Week1
    IntelliJ IDEA下Git的配置与使用(命令行下)
    Java语言程序设计课程学期总结
    JDBC访问数据库的一些小技巧
    Conference-Web Search and Data Mining
    线程停止与volatile
    班会-2016-2017第2学期
    Java第11次实验(JDBC数据库编程)
    Python-Jupyter Notebook使用技巧
  • 原文地址:https://www.cnblogs.com/gongxing/p/4654924.html
Copyright © 2020-2023  润新知