`
piperzero
  • 浏览: 3479028 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Thread的setDaemon(true)方法的作用

 
阅读更多

定义:守护线程--也称服务线程,在没有用户线程可服务时会自动离开。优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。

设置:通过setDaemon(true)来设置线程为守护线程将一个用户线程设置为守护线程的方式是在线程对象创建之前用线程对象的setDaemon方法。

example:垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。

生命周期:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统同生共死。那Java的守护线程是什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。

例子程序:

thread=newThread(this);

thread.setDaemon(true);

thread.start();

java虚拟机中没有非守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底会出现什么问题。

importjava.io.IOException;

/*

*守护线程在没有用户线程可服务时自动离开

*Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。

*这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。

*将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。

*典型的守护线程例子是JVM中的系统资源自动回收线程

*我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,

*当我们的程序中不再有任何运行中的Thread

*程序就不会再产生垃圾,垃圾回收器也就无事可做,

*所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。

*它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。

*守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

*也就是说守护线程不依赖于终端,但是依赖于系统,与系统同生共死

*Java的守护线程是什么样子的呢。

*JVM中所有的线程都是守护线程的时候,JVM就可以退出了;

*如果还有一个或以上的非守护线程则JVM不会退出。

*/

publicclassThreadDemoextendsThread{

publicThreadDemo(){

super("zhuyong");

}

/***//**

*线程的run方法,它将和其他线程同时运行

*/

publicvoidrun(){

for(inti=1;i<=40;i++){

try{

Thread.sleep(100);

}catch(InterruptedExceptionex){

ex.printStackTrace();

}

System.out.println("TestThread:"+Thread.currentThread().getName()+i);

}

}

publicstaticvoidmain(String[]args){

ThreadDemotest=newThreadDemo();

test.setDaemon(true);

test.start();

System.out.println("isDaemon="+test.isDaemon());

try{

System.in.read();//接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束

}catch(IOExceptionex){

ex.printStackTrace();

}

}

}

分享到:
评论

相关推荐

    python使用Thread的setDaemon启动后台线程教程

    1)setDaemon(True): 当主线程退出时,后台线程随机退出; 2)setDaemon(False)(默认情况): 当主线程退出时,若前台线程还未结束,则等待所有线程结束,相当于在程序末尾加入join(). 实例: 例子描述:主线程调用giveures给出...

    android nanohttpd 手机端 迷你服务器

    t setDaemon true ; t start ; } HTTPSession内保存了Socket的引用 "&gt;anoHTTPD是个很简单的http服务器 简单到只有一个java文件 主要原理是用ServerSocket接受请求 对每一个请求的Socket创建一个线程去处理...

    JAVA最新面试资料-备战2023金三银四

    Thread.setDaemon()必须在 Thread.start()之前调用,否则运行时会抛出异常。 两者的区别: 唯一的区别是判断虚拟机(JVM)何时离开,Daemon 是为其他线程提供服务,如果全 部的 User Thread 已经撤离,Daemon 没有可...

    解决python父线程关闭后子线程不关闭问题

    我们都知道,python可以通过threading module来创建新的线程,然而在创建线程的线程(父线程)关闭之后,相应的子线程可能却没有关闭,这可能是因为代码中没有使用setDaemon(True)函数。 接下来,使用一个例子来...

    python线程join方法原理解析

    2 如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,不会等待子线程的执行结果。而且随着主线程退出,子线程也消亡。 3 join方法的作用是阻塞,等待子线程结束,join...

    java 线程Sample

    ExecutorService exec=Executors.newFixedThreadPool(2); Thread1 th1 = new Thread1("CRTA");... th1.setDaemon(true); th1.setPriority(MIN_PRIORITY); th1.start(); Thread1 th2 = new Thread1("CRTB");

    python小工具-多线程phpmyadmin密码分析

    for username in open("username.txt","r"): ... gushi.setDaemon(True) 53 gushi.start() 54 lines = 5 55 for x in range(lines): 56 y = Crack(url,queue) 57 y.start() 58 threads.append(y)

    Python守护线程用法实例

    本文实例讲述了Python守护线程...(thread.setDaemon(True))就表示这个线程“不重要”。 如果你想等待子线程完成再退出,那就什么都不用做,或者显示地调用thread.setDaemon(False),设置daemon的值为false。新的子

    Python线程同步的实现代码

    子线程在主线程运行结束后,会继续执行完,如果给子线程设置为守护线程(setDaemon=True),主线程运行结束子线程即结束; 如果join()线程,那么主线程会等待子线程执行完再执行。 import threading import time def...

    对python 多线程中的守护线程与join的用法详解

    守护线程:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.setDaemon(True),要在thread.start()之前设置,默认是false的,也就是主线程结束时,子线程依然在执行。...

    解决PySide+Python子线程更新UI线程的问题

    t1.setDaemon(True) t1.start() 之后我发现用子线程去调用UI线程是行不通的,只能通过信号和槽来实现,于是 首先,定义一个类,让他实现PySide.QtCore.QObject类 class Data(PySide.QtCore.QObject): #定义信号 ...

    Python守护进程实现过程详解

    这篇文章主要介绍了Python守护进程实现过程详解,文中通过示例代码介绍的非常详细,对...(thread.setDaemon(True))就表示这个线程“不重要”。 如果你想等待子线程完成再退出,那就什么都不用做,或者显示地调用threa

Global site tag (gtag.js) - Google Analytics