Java中的守护进程线程是什么?
任何人都可以告诉我什么守护线程在Java?
守护进程线程是一个线程,当程序完成但线程仍在运行时,它不会阻止JVM退出。 守护线程的一个例子就是垃圾收集。
您可以使用setDaemon(boolean)
方法在线程启动之前更改Thread
守护程序属性。
还有几点(参考: 实践中的Java并发 )
- 当一个新的线程被创build时,它将inheritance其父进程的守护进程状态。
-
普通线程和守护进程线程在退出时会发生什么变化。 当JVM暂停任何剩余的守护进程线程被放弃时 :
- 最后块不执行 ,
- 堆栈没有解开 – JVM刚刚退出。
由于这个原因,应该谨慎地使用守护进程线程,并且将它们用于可能执行任何types的I / O的任务是危险的。
以上所有的答案都很好。 这里有一个简单的小代码片段,来说明不同之处。 用setDaemon
每个true和false值来setDaemon
。
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, (ie when it's a user thread), // the Worker thread continues to run. // When true, (ie 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 } } } }
传统上,UNIX中的守护进程是那些在后台不断运行的守护进程,就像Windows中的服务一样。
Java中的守护进程线程不会阻止JVM退出。 具体来说,只有守护进程线程保留时,JVM才会退出。 你可以通过调用Thread
的setDaemon()
方法来创build一个。
阅读守护线程 。
守护进程线程就像其他线程或对象一样运行在与守护线程相同的进程中。 守护线程用于后台支持任务,只有在正常线程正在执行时才需要。 如果正常的线程没有运行,剩余的线程是守护线程,那么解释器退出。
例如,HotJava浏览器最多使用四个名为“Image Fetcher”的后台进程线程从文件系统或networking为任何需要线程的线程提取图像。
守护进程线程通常用于为您的应用程序/ applet执行服务(例如,加载“fiddley位”)。 用户线程和守护进程线程之间的核心区别在于,当所有用户线程终止时,JVM只会closures一个程序。 当不再有任何用户线程正在运行时,守护线程将被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.java C:\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 method C:\j2se6\thread>
守护进程线程是被认为在后台执行一些任务的线程,例如处理请求或应用程序中可能存在的各种chronjob。
当你的程序只剩下达恩线程时,它将退出。 这是因为通常这些线程与普通线程一起工作,并提供事件的后台处理。
你可以使用setDaemon
方法指定一个Thread
是一个恶魔,它们通常不会退出,也不会被中断。
我想澄清一个误区:
- 假设守护进程线程(如B)在用户线程内创build(如A); 那么结束这个用户线程/父线程(A)将不会结束它创build的守护线程/子线程(B); 提供的用户线程是当前正在运行的唯一一个。
- 所以在线程结束时没有父子关系。 所有的守护进程线程(不pipe在哪里创build)将在没有单个活动用户线程时结束,并导致JVM终止。
- 即使这样(父/子)都是守护线程。
- 如果从一个守护线程创build一个子线程,那么这也是一个守护线程。 这将不需要任何明确的守护进程线程标志设置。 同样,如果从用户线程创build的子线程也是用户线程,那么如果要更改它,则在该子线程启动之前需要显式守护进程标志设置。
Java有一种特殊的线程叫守护线程。
- 非常低的优先权。
- 只有当同一个程序的其他线程没有运行时才执行。
- 当守护进程线程是运行在程序中的唯一线程时,JVM结束完成这些线程的程序。
什么是守护线程用于?
通常用作普通线程的服务提供者。 通常有一个无限循环等待服务请求或执行线程的任务。 他们不能做重要的工作。 (因为我们不知道他们什么时候有CPU时间,如果没有其他线程在运行,他们可以随时完成。
这种线程的典型例子是Java垃圾收集器 。
还有更多…
- 在调用
setDaemon()
方法之前,只调用setDaemon()
start()
方法。 线程一旦运行,就不能修改其守护进程状态。 - 使用
isDaemon()
方法来检查一个线程是一个守护线程还是一个用户线程。
java中的守护进程线程是什么?
- 守护线程可以在任何时间closures它们的stream程,Non-Daemon即用户线程完全执行。
- 守护进程线程以低优先级执行。
- 守护进程线程是在其他非守护进程线程正在运行的情况下在后台间歇运行的线程。
- 当所有的非守护线程完成后,守护线程自动终止。
- 守护进程线程是运行在相同进程中的用户线程的服务提供者。
- JVM不关心守护线程在运行状态时完成,甚至不是最后阻塞也让执行。 JVM确实优先考虑我们创build的非守护线程。
- 守护进程线程在Windows中充当服务。
- 当所有用户线程(与守护进程线程不同)终止时,JVM停止守护进程线程。 因此,只要所有用户线程都停止,守护进程线程就可以用来实现监视function,因为线程被JVM停止。
守护线程和用户线程。 一般来说,程序员创build的所有线程都是用户线程(除非你指定它是守护进程,或者你的父线程是一个守护线程)。 用户线程通常用于运行我们的程序代码。 除非所有用户线程都终止,否则JVM不会终止。
守护进程线程就像普通的线程,只是当其他非守护进程线程不存在时,JVM才会closures。 守护线程通常用于为您的应用程序执行服务。
守护进程线程如大家所说,不会约束JVM退出,所以从退出的angular度来看,基本上它是一个应用程序的快乐线程。
想要添加守护进程线程可以用于说我提供的API像推送数据到第三方服务器/或JMS,我可能需要在客户端JVM级别聚合数据,然后发送到JMS在一个单独的线程。 我可以使这个线程作为守护线程,如果这不是一个强制性的数据被推送到服务器。 这种数据就像日志推送/聚合。
问候,马尼什
Java中的守护进程线程是那些在后台运行的线程,主要由JVM创build,用于执行垃圾收集和其他内务任务等后台任务。
注意事项:
-
任何由在Java中运行main方法的主线程创build的线程在默认情况下都是非守护进程,因为Thread从创build它的线程inheritance它的守护进程性质,即父线程,因为主线程是非守护线程,所以从其创build的任何其他线程保持非守护进程,直到通过调用setDaemon(true)进行守护进程。
-
Thread.setDaemon(true)创build一个Thread守护进程,但只能在Java中启动Thread之前调用它。 如果相应的线程已经启动并运行,它将抛出IllegalThreadStateException。
Java中守护进程和非守护进程之间的区别:
1)JVM不会等待任何守护进程线程完成之前完成。
2)当JVM终止时,守护线程与用户线程的处理方式不同,最后是块不被调用,堆栈不被解除,JVM刚刚退出。
守护进程线程就像负责pipe理资源的守护进程一样,守护进程线程由Java虚拟机创build以服务用户线程。 例子更新系统为unix,unix是守护进程。 守护线程的子节点总是守护线程,所以默认情况下守护程序是false.you可以使用“isDaemon()”方法检查线程为守护进程或用户。 所以守护进程线程或守护进程基本上负责pipe理资源。 例如,当你启动jvm时,有垃圾收集器正在运行,这是守护程序线程,优先级为1,最低的是pipe理内存。 只要用户线程是活着的,jvm就是活着的,你不能杀死守护进程。thread.jvm负责杀死守护进程线程。
守护线程通常被称为“服务提供者”线程。 这些线程不应该被用来执行程序代码,而是系统代码。 这些线程与您的代码并行运行,但JVM可以随时杀死它们。 当JVM找不到用户线程时,它会停止它,所有守护线程立即终止。 我们可以使用下面的代码将非守护线程设置为守护进程:
setDaemon(true)
守护线程就像助手一样。 非守护线程就像表演者一样。 助理帮助表演者完成一项工作。 工作完成后,表演者不再需要帮助。 由于不需要帮助,助理离开了这个地方。 所以当非守护程序线程的作业结束时,守护程序线程就会走开。
任何Java线程都可以是守护线程。
守护进程线程是与守护进程线程在同一进程中运行的其他线程的服务提供者。 例如, HotJava浏览器最多使用四个名为“Image Fetcher”的后台进程线程从文件系统或networking为任何需要线程的线程提取图像。 守护线程的run()方法通常是等待服务请求的无限循环。 当进程中剩余的线程是守护线程时,解释器退出。 这是有道理的,因为只有守护线程保留时,守护线程才能提供服务。
要指定一个线程是守护线程,请使用参数true调用setDaemon方法。 要确定一个线程是否是守护线程,使用访问器方法isDaemon 。
希望这可以帮助!!!!!!
对于我来说,守护线程就像用户线程的pipe家。 如果所有的用户线程都完成了,守护进程线程没有任何工作,并被JVM终止。 我在YouTubevideo中解释了它。
守护进程线程是在后台运行的线程,只要进程的其他非守护进程线程仍在运行。 因此,当所有非守护进程线程完成时,守护进程线程被终止。 非守护线程的例子是运行Main的线程。 通过在线程启动之前调用setDaemon()方法来使线程成为守护进程
更多参考: Java中的守护进程线程
我们只用代码和工作例子来谈谈。 我喜欢上面的俄罗斯的答案,但要消除我的任何疑问,我稍微加强了一点。 我运行了两次,一次将工作线程设置为deamon true(deamon线程),另一次将其设置为false(用户线程)。 它确认deamon线程在主线程终止时结束。
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, (ie when it's a user thread), // the Worker thread continues to run. // When true, (ie 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 Thread working from Worker thread 0 working from Worker thread 1 Main Thread ending Process finished with exit code 0 result when setDeamon(false) ===================================== I am a User Thread (none-deamon) working from Worker thread 0 working from Worker thread 1 Main Thread ending working from Worker thread 2 working from Worker thread 3 working from Worker thread 4 working from Worker thread 5 working from Worker thread 6 working from Worker thread 7 working from Worker thread 8 working from Worker thread 9 Worker thread ends. Process finished with exit code 0
守护线程在创build者线程退出时死亡。
非守护线程(默认)甚至可以比主线程寿命更长。
if ( threadShouldDieOnApplicationEnd ) { thread.setDaemon ( true ); } thread.start();
在Java中, 守护进程线程是不阻止Java虚拟机(JVM)退出的线程types之一。 守护线程的主要目的是执行后台任务,特别是在一些例行的周期性任务或工作的情况下。 使用JVM退出时,守护进程线程也会死亡。
通过设置一个thread.setDaemon(true),一个线程变成一个守护线程。 但是,只能在线程启动之前设置此值。