谁能告诉我Java中有哪些守护程序线程?


#1楼

守护程序线程就像其他与守护程序线程在同一进程中运行的线程或对象的服务提供者一样。 守护程序线程用于后台支持任务,仅在执行正常线程时才需要。 如果正常线程未在运行,而其余线程是守护程序线程,则解释器退出。

例如,HotJava浏览器最多使用四个名为“ Image Fetcher”的守护程序线程从文件系统或网络中获取任何需要一个线程的图像。

守护程序线程通常用于为您的应用程序/小程序执行服务(例如加载“小提琴位”)。 用户线程和守护程序线程之间的核心区别在于,JVM将仅在所有用户线程终止后才关闭程序。 当不再运行任何用户线程(包括执行的主线程)时,JVM将终止守护程序线程。

setDaemon(true / false)? 此方法用于指定线程是守护程序线程。

公共布尔isDaemon()? 此方法用于确定线程是否是守护程序线程。

例如:

public class DaemonThread extends Thread {public void run() {System.out.println("Entering run method");try {System.out.println("In run Method: currentThread() is" + Thread.currentThread());while (true) {try {Thread.sleep(500);} catch (InterruptedException x) {}System.out.println("In run method: woke up again");}} finally {System.out.println("Leaving run Method");}}public static void main(String[] args) {System.out.println("Entering main Method");DaemonThread t = new DaemonThread();t.setDaemon(true);t.start();try {Thread.sleep(3000);} catch (InterruptedException x) {}System.out.println("Leaving main method");}}

输出:

C:\java\thread>javac DaemonThread.javaC:\java\thread>java DaemonThread
Entering main Method
Entering run method
In run Method: currentThread() isThread[Thread-0,5,main]
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
Leaving main methodC:\j2se6\thread>

#2楼

守护程序线程与普通线程一样,只是JVM仅在其他非守护程序线程不存在时才会关闭。 守护程序线程通常用于为您的应用程序执行服务。


#3楼

守护进程线程正如大家所解释的那样,不会限制JVM退出,因此从退出的角度来看,它基本上是Application的一个快乐线程。

想要补充一点,当我提供一个API(例如将数据推送到第三方服务器/或JMS)时,可以使用守护程序线程,我可能需要在客户端JVM级别聚合数据,然后在单独的线程中将其发送到JMS。 如果这不是要推送到服务器的必需数据,则可以将该线程作为守护程序线程。 这种数据就像日志推送/聚合。

问候,Manish


#4楼

创建者线程退出时,守护程序线程死亡。

非守护程序线程(默认)甚至可以比主线程寿命更长。

if ( threadShouldDieOnApplicationEnd ) {thread.setDaemon ( true );
}
thread.start();

#5楼

Java中的守护程序线程是那些在后台运行并主要由JVM创建的线程,用于执行后台任务,例如垃圾回收和其他内部任务。

注意事项:

  1. 默认情况下,由主线程创建并在Java中运行main方法的任何线程都是非守护程序,因为Thread会从创建它的线程(即父线程)继承其守护程序性质,并且由于主线程是非守护程序线程,因此从该线程创建的任何其他线程都会保持非守护进程,直到通过调用setDaemon(true)显式创建守护程序为止。

  2. Thread.setDaemon(true)创建一个Thread守护程序,但是只能在以Java启动Thread之前调用它。 如果相应的线程已经启动并且正在运行,它将抛出IllegalThreadStateException。

Java中Daemon和Non Daemon线程之间的区别:

1)JVM在存在之前不等待任何守护进程线程完成。

2)当JVM终止时,守护进程线程与用户线程的处理方式有所不同,最终不会调用块,不会取消堆栈堆栈,而只是退出JVM。


#6楼

Java有一种特殊的线程,称为守护程序线程。

  • 优先级非常低。
  • 仅在没有运行同一程序的其他线程时执行。
  • 当守护程序线程是程序中唯一运行的线程时,JVM将结束这些线程的程序。

守护程序线程有什么用?

通常用作普通线程的服务提供者。 通常有一个无限循环,等待服务请求或执行线程的任务。 他们不能做重要的工作。 (因为我们不知道它们什么时候有CPU时间,并且如果没有其他线程在运行,它们可以在任何时间完成。)

此类线程的典型示例是Java垃圾收集器

还有更多...

  • 只能在调用setDaemon()方法之前调用setDaemon() start()方法。 线程运行后,您将无法修改其守护程序状态。
  • 使用isDaemon()方法检查线程是守护程序线程还是用户线程。

#7楼

只要进程的其他非守护线程仍在运行,守护线程就是在后台运行的线程。 因此,当所有非守护程序线程完成时,守护程序线程将终止。 非守护程序线程的一个示例是运行Main的线程。 通过在启动线程之前调用setDaemon()方法将线程制成守护程序

有关更多参考: Java中的守护程序线程


#8楼

守护程序线程是在程序完成但线程仍在运行时不会阻止JVM退出的线程。 守护程序线程的一个示例是垃圾回收。

您可以使用setDaemon(boolean)方法在线程启动之前更改Thread守护程序属性。


#9楼

UNIX中的传统守护进程是那些经常在后台运行的进程,就像Windows中的服务一样。

Java中的守护程序线程是一种不会阻止JVM退出的线程。 特别是,仅保留后台驻留程序线程时,JVM将退出。 您可以通过在Thread上调用setDaemon()方法来创建一个。

阅读Daemon线程 。


#10楼

守护程序线程是被认为在后台执行某些任务的线程,例如处理请求或应用程序中可能存在的各种计时任务。

当您的程序仅剩下守护程序线程时 ,它将退出。 这是因为通常这些线程与普通线程一起工作并提供事件的后台处理。

您可以使用setDaemon方法将Thread指定为守护程序 ,它们通常不退出,也不会被中断..它们只会在应用程序停止时停止。


#11楼

还有几点(参考: Java并发实践 )

  • 创建新线程时,它将继承其父级的守护程序状态。
  • 当所有非守护程序线程完成时,JVM暂停,所有剩余的守护程序线程都被放弃

    • 最后块不执行
    • 堆栈未解开-JVM刚刚退出。

    因此,应谨慎使用守护程序线程,将其用于可能执行任何I / O的任务是危险的。


#12楼

任何Java线程都可以是守护程序线程。

守护程序线程是与守护程序线程在同一进程中运行的其他线程的服务提供程序。 例如, HotJava浏览器最多使用四个名为 “Image Fetcher”的守护程序线程从文件系统或网络中获取需要其中任何线程的图像。 守护程序线程的 run()方法通常是等待服务请求的无限循环。 当进程中唯一剩余的线程是守护程序线程时,解释器退出。 这是有道理的,因为当只剩下守护程序线程时,没有其他线程可供守护程序线程提供服务。

要指定线程是守护程序线程,请使用参数true调用setDaemon方法。 要确定线程是否是守护程序线程,请使用访问器方法isDaemon

希望这可能有所帮助!!!!!!


#13楼

守护程序线程类似于守护程序进程,它负责管理资源,Java VM创建了一个守护程序线程来服务用户线程。 Unix,unix的示例更新系统是守护进程。 守护程序线程的子代始终是守护程序线程,因此默认情况下,守护程序为false。您可以使用“ isDaemon()”方法以守护程序或用户身份检查线程。 因此,守护程序线程或守护程序进程基本上负责管理资源。 例如,当您启动jvm时,正在运行的垃圾回收器是守护进程线程,其优先级最低为1,即管理内存。 只要用户线程处于活动状态,jvm仍处于活动状态,您将无法杀死守护程序线程。jvm负责杀死守护程序线程。


#14楼

守护程序的定义(计算):

后台进程处理对服务的请求,例如打印假脱机和文件传输,并且在不需要时处于休眠状态。

-来源: 牛津词典提供的英语

Java中的Daemon线程是什么?

  • 守护进程线程可以在其流之间的任何时间关闭,即非守护进程,即用户线程完全执行。
  • 守护程序线程是只要其他非守护程序线程正在运行,它们就会在后台间歇运行的线程。
  • 当所有非守护程序线程完成时,守护程序线程会自动终止。
  • 守护程序线程是在同一进程中运行的用户线程的服务提供程序。
  • JVM不在乎守护程序线程在处于“运行”状态时是否完成,甚至最终阻塞也不允许执行。 JVM会优先考虑由我们创建的非守护线程。
  • 守护程序线程在Windows中充当服务。
  • 当所有用户线程(与守护程序线程相反)终止时,JVM停止守护程序线程。 因此,当所有用户线程停止运行时,JVM会停止运行该线程,守护进程线程可以用于实现监视功能。

#15楼

我想澄清一个误解:

  • 假设是否在用户线程(例如A)中创建了守护程序线程(例如B); 那么此用户线程/父线程(A)的结尾不会结束其创建的守护程序线程/子线程(B); 提供的用户线程是当前正在运行的唯一线程。
  • 因此,线程结束没有父子关系。 一旦没有单个活动用户线程并且导致JVM终止,所有守护程序线程(无论创建位置如何)都将结束。
  • 即使这两个(父/子)守护程序线程也是如此。
  • 如果从守护程序线程创建了子线程,则该线程也是守护程序线程。 这不需要任何显式的守护程序线程标志设置。 同样,如果从用户线程创建的子线程也就是用户线程,则要更改它,则在启动该子线程之前需要显式的守护程序标志设置。

#16楼

在Java中, 守护程序线程是不会阻止Java虚拟机(JVM)退出的线程类型之一。 守护程序线程的主要目的是执行后台任务,尤其是在某些例行定期任务或工作的情况下。 随着JVM退出,守护程序线程也消失了。

通过设置thread.setDaemon(true) ,线程成为守护程序线程。 但是,只能在线程启动之前设置此值。


#17楼

对我来说,守护进程线程就像用户线程的管家一样。 如果所有用户线程均已完成,则守护进程线程将不执行任何作业,并被JVM终止。 我在YouTube视频中对此进行了解释。


#18楼

让我们仅以代码和工作示例进行讨论。 我喜欢上面的russ的回答,但是为了消除我的任何疑问,我对它进行了一些增强。 我运行了两次,一次将工作线程设置为deamon true(守护线程),另一次将其设置为false(用户线程)。 它确认主线程终止时守护进程线程终止。

public class DeamonThreadTest {public static void main(String[] args) {new WorkerThread(false).start();    //set it to true and false and run twice.try {Thread.sleep(7500);} catch (InterruptedException e) {// handle here exception}System.out.println("Main Thread ending");}}class WorkerThread extends Thread {boolean isDeamon;public WorkerThread(boolean isDeamon) {// When false, (i.e. when it's a user thread),// the Worker thread continues to run.// When true, (i.e. when it's a daemon thread),// the Worker thread terminates when the main// thread terminates.this.isDeamon = isDeamon;setDaemon(isDeamon);}public void run() {System.out.println("I am a " + (isDeamon ? "Deamon Thread" : "User Thread (none-deamon)"));int counter = 0;while (counter < 10) {counter++;System.out.println("\tworking from Worker thread " + counter++);try {sleep(5000);} catch (InterruptedException e) {// handle exception here}}System.out.println("\tWorker thread ends. ");}
}result when setDeamon(true)
=====================================
I am a Deamon Threadworking from Worker thread 0working from Worker thread 1
Main Thread endingProcess finished with exit code 0result when setDeamon(false)
=====================================
I am a User Thread (none-deamon)working from Worker thread 0working from Worker thread 1
Main Thread endingworking from Worker thread 2working from Worker thread 3working from Worker thread 4working from Worker thread 5working from Worker thread 6working from Worker thread 7working from Worker thread 8working from Worker thread 9Worker thread ends. Process finished with exit code 0

#19楼

守护程序线程通常称为“服务提供者”线程。 这些线程不应用于执行程序代码,而应用于执行系统代码。 这些线程与您的代码并行运行,但是JVM可以随时将其杀死。 当JVM没有找到用户线程时,它将停止它,并且所有守护程序线程将立即终止。 我们可以使用以下命令将非守护进程线程设置为守护进程:

setDaemon(true)

#20楼

守护程序线程就像助手。 非守护程序线程就像领先者。 助手帮助表演者完成工作。 作业完成后,表演者不再需要帮助即可表演。 由于不需要帮助,助手便离开了该地点。 因此,当非守护程序线程的作业结束时,守护程序线程将前进。


#21楼

当最后一个非守护线程执行完成时,JVM将完成工作。 默认情况下,JVM将创建一个线程作为非守护进程,但是我们可以借助setDaemon(true)方法将Thread设置为守护进程。 守护程序线程的一个很好的例子是GC线程,一旦所有非守护程序线程都完成,它将立即完成他的工作。


#22楼

这是一个示例,用于在由于用户线程不存在而导致jvm退出的情况下测试守护程序线程的行为。

请注意下面输出中的倒数第二行,当主线程退出时,守护线程也死了,并且在finally块中未打印finally execute9语句。 这意味着,如果由于用户线程不存在而导致JVM退出,则不会关闭守护程序线程的finally块中关闭的所有I / O资源。

public class DeamonTreadExample {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {int count = 0;while (true) {count++;try {System.out.println("inside try"+ count);Thread.currentThread().sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {System.out.println("finally executed"+ count);}}});t.setDaemon(true);t.start();Thread.currentThread().sleep(10000);System.out.println("main thread exited");}
}

输出量

inside try1
finally executed1
inside try2
finally executed2
inside try3
finally executed3
inside try4
finally executed4
inside try5
finally executed5
inside try6
finally executed6
inside try7
finally executed7
inside try8
finally executed8
inside try9
finally executed9
inside try10
main thread exited

#23楼

守护程序线程和用户线程。 通常,程序员创建的所有线程都是用户线程(除非您将其指定为守护程序,或者您的父线程是守护程序线程)。 用户线程通常旨在运行我们的程序代码。 除非所有用户线程都终止,否则JVM不会终止。


#24楼

以上所有答案都是好的。 这是一个简单的小代码段,以说明区别。 尝试使用setDaemon的true和false的每个值。

public class DaemonTest {public static void main(String[] args) {new WorkerThread().start();try {Thread.sleep(7500);} catch (InterruptedException e) {// handle here exception}System.out.println("Main Thread ending") ;}}class WorkerThread extends Thread {public WorkerThread() {// When false, (i.e. when it's a user thread),// the Worker thread continues to run.// When true, (i.e. when it's a daemon thread),// the Worker thread terminates when the main // thread terminates.setDaemon(true); }public void run() {int count = 0;while (true) {System.out.println("Hello from Worker "+count++);try {sleep(5000);} catch (InterruptedException e) {// handle exception here}}}
}

什么是Java中的守护程序线程?相关推荐

  1. Java中的守护程序线程

    Daemon thread in java can be useful to run some tasks in background. When we create a thread in java ...

  2. java中的后台线程、前台线程、守护线程区别

    java中的后台线程.前台线程.守护线程区别 区别和联系 区别 联系 区别和联系 区别 后台线程和守护线程是一样的. 后台线程不会阻止进程的终止,而前台线程会, 可以在任何时候将前台线程修改为后台线程 ...

  3. Java中如何实现线程的超时中断

    转载自  Java中如何实现线程的超时中断 背景 之前在实现熔断降级组件的时候,需要实现接口请求的超时中断.意思是,业务在使用熔断降级功能时,在平台上设置了一个超时时间,如果请求进入熔断器开始计时,接 ...

  4. Java中枚举的线程安全性及序列化问题

    转载自  Java中枚举的线程安全性及序列化问题 Java SE5提供了一种新的类型-Java的枚举类型,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序 ...

  5. java创建单线程计时器_我们如何在Java中实现计时器线程?

    该定时器类计划任务一次或多次给定的时间运行.它也可以作为后台程序线程在后台运行.要将Timer与守护程序线程相关联,有一个带有布尔值的构造函数.计时器以固定的延迟和固定的速率安排任务.在固定的延迟中, ...

  6. java中我爱你_Java线程学习(转)

    编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:s ...

  7. java中等待所有线程都执行结束

    使用CountDownLatch,这其实是最优雅的写法了,每个线程完成后都去将计数器减一,最后完成时再来唤醒 @Test public void testThreadSync3() { final V ...

  8. Java中怎样创建线程安全的方法

    面试问题: 下面的方法是否线程安全?怎样让它成为线程安全的方法? class MyCounter {private static int counter = 0;public static int g ...

  9. java中四种线程池的区别

    本文按: 一. 线程池的使用 二. 几种线程池的区别 三. 如何合理配置线程池 一.线程池的使用 在Java中,通常使用Executors 获取线程池.常用的线程池有以下几种: (1)CachedTh ...

最新文章

  1. 关于自注意力机制的思考
  2. linux ubuntu 获取仓库源码并构建
  3. 机器学习篇-指标:AUC
  4. java异常捕获的一点感悟
  5. .describe() python_python的apply应用:一般性的“拆分-应用-合并”,附加详细讲解
  6. java word转pdf_java里实现Word转PDF的几种方案
  7. dom4j实现为list添加父节点_最大堆的实现与原理
  8. vue element-ui NavMenu错位问题
  9. Android应用自动更新功能代码实现
  10. NeatUpload的安装使用,可传大文件,显示进度条
  11. python编程师app_新技能:用 Python 写一个安卓 APP
  12. 使用vgg19进行微表情分类
  13. 金银猫 服务器维护,金银猫案情进展 投资者可在网上登记报案
  14. Oracle的同义词
  15. 防火墙和端口,防火墙的功能和作用
  16. 安全管理实务之一:补丁管理(转)
  17. 使用Mailgun Store():应用程序传入电子邮件的临时邮箱
  18. The JSON value could not be converted to System.Int64
  19. SSDP 简单服务发现协议
  20. Hive系列之HSQL转换成MapReduce过程

热门文章

  1. [Be a Coding Plasterer] Components 1:get Basic Things
  2. Apache查看并发及TIME_WAIT过多的解决
  3. 如何理解和应用Java的多态
  4. 算法一看就懂之「 递归 」
  5. 用Python写一个滑动验证码
  6. 《Windows Mobile平台应用与开发》写作工作顺利进行中
  7. js+css3实现旋转效果
  8. 蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归
  9. 90 条 Python 程序建议
  10. zabbix监控Linux系统服务