08_控制线程_后台线程(守护线程)

【后台线程】

后台线程(Daemon Thread):运行在后台,他的任务是为其它的线程提供服务,又称为"守护线程"。JVM的垃圾回收线程就是典型的后台线程。

[ 特征 ]

如果所有的前台线程都死亡,后台线程会自动死亡。

调用Thread对象的setDaemon(true)方法可以将指定的线程设置成后台线程。

当整个虚拟机中只剩下后台线程时,程序就没有继续运行的必要了,所以虚拟机也就退出了。

Thread类提供了一个isDaemon()方法,用来判断指定线程是否为后台线程。

【示例代码】

package com.Higgin.part02;

class DaemonThread implements Runnable{

    //定义后台线程的形成执行体和普通线程无区别
    @Override
    public void run() {
        for(int i=0;i<1000;i++){
            System.out.println(Thread.currentThread().getName()+"===="+i);
        }
    }

}

public class Demo02 {
    public static void main(String[] args) {
        DaemonThread dt=new DaemonThread();
        Thread t1=new Thread(dt,"后台线程");
        t1.setDaemon(true);  //将此线程设置成后台线程!!
        t1.start();  //启动线程

        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"===="+i);
        }
        //main线程运行到for循环结束,就算此时后台线程的执行体for循环未结束 ,也得结束线程!
    }
}

【运行结果】

后台线程本来希望运行到i=999的,但是前台唯一的main主线程运行结束了,JVM自动退出,后台线程也会随之结束。

【小结】

从上面的代码看,主线程默认是前台线程,t1线程设置为后台线程。

【注意1】

并不是所有的线程默认都是前台线程,

前台线程创建的子线程默认是前台线程

后台线程创建的子线程默认是后台线程

【注意2】

前台线程死亡后,JVN会通知后台线程死亡,但从它收到指令到做出相应,需要一定的时间,而且要将某个线程设置为后台线程,必须要在该线程启动之前(比如本案例中main()方法的for循环之前),即setDaemon(true)必须在start()方法之前调用,否则会引发IllegalThreadStateException异常。

时间: 2024-10-29 01:24:47

08_控制线程_后台线程(守护线程)的相关文章

第二十八(线程的同步、守护线程、Timer 定时器)

/* 模拟ATM取款,不是线程同步机制,多线程同时对一个账户进行操作 t1 和 t2 异步编程模型:t1线程执行t1,t2线程执行的是t2,两个线程之间谁也不等于谁 同步编程模型:t1线程和t2线程执行,当t1线程必须等于t2的线程执行结果之后,t1线程才能执行 这是同步编程模型. 什么时候需要引入同步 1. 为了数据安全,尽管应用程序的使用率低,但是为了保证数据安全性,必须的加入线程同步机制 线程同步机制 使程序变成了(等同)单线程 2. 在什么条件下需要使用线程同步 <1> 必须是多线程环

2.5 驻守后台:守护线程

package 第二章.守护线程; /** * Created by zzq on 2018/1/18. */public class 守护线程Test { public static class MyThread extends Thread{ private int i = 0; @Override public void run(){ super.run(); try{ while(true){ i++; System.out.println("i="+i); Thread.sl

python网络编程--线程(锁,GIL锁,守护线程)

1.线程 1.进程与线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率.很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了. 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行. 如果这两个缺点理解比较困难的话,举个现实的例子也许你就清楚

线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i): 3 print(i) 4 if __name__ == '__main__': 5 for i in range(10): 6 t = Thread(target=f1,args=(i,)) 7 t.start() 8 print('主线程') 方式二: 1 from threading im

python全栈开发基础【第二十四篇】(利用threading模块开线程、join与守护线程、GIL与Lock)

一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 创建线程的开销比创建进程的开销小,因而创建线程的速度快. #开启进程的第一种方式 from multiprocessing import Process from threading import Thread import os import time def work(): print('<%s> is running'%os.g

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

所谓的后台(daemon)线程,也叫守护线程,是指程序在运行的时候,在后台提供一种通用服务的线程(例如:守护线程GC),并且,这种线程并不属于程序中不可或缺的部分:因此当所有的非后台线程结束时,程序也就终止了,同时杀死所有的后台线程.相反,只要有任何非后台线程(例如:非守护线程main())还存在,程序就不会终止.后台线程具有最低的优先级. setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,默认(false)为User模式.setDa

java 守护线程整理

java中finally语句不走的可能存在system.exit(0)与守护线程 线程sleep采用TimeUnit类 设定线程的名字thread.getcurrentThread().setName() 设定守护线程thread.getcurrentThread().setDaemon(true) http://www.cnblogs.com/diyingyun/archive/2011/12/04/2275268.html 守护线程在没有用户线程可服务时自动离开,在 Java中比较特殊的线程

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

最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ,(PS:以前忽略了). 估计学过Unix开发但是没有细致学习Java的同学们会疑惑了,操作系统里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制是构建在JVM的基础之上的,意思是Java平台把操作系统的底层给屏蔽起来,所以它可以在它自己的虚拟的平台里面构造出对自己有利的机制,而语言或者说平

Thread 守护线程 Thread.setDaemon详解

java中线程分为两种类型:用户线程和守护线程.通过Thread.setDaemon(false)设置为用户线程:通过Thread.setDaemon(true)设置为守护线程.如果不设置次属性,默认为用户线程. 用户线程和守护线程的区别: 1. 主线程结束后用户线程还会继续运行,JVM存活:主线程结束后守护线程和JVM的状态又下面第2条确定. 2.如果没有用户线程,都是守护线程,那么JVM结束(随之而来的是所有的一切烟消云散,包括所有的守护线程). 补充说明: 定义:守护线程--也称“服务线程