`

Java守护线程学习总结

    博客分类:
  • java
 
阅读更多

在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 

用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:

只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。

 

User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。

守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。下面的方法就是用来设置守护线程的。 

Thread daemonTread = new Thread();  
   
  // 设定 daemonThread 为 守护线程,default false(非守护线程)  
 daemonThread.setDaemon(true);  
   
 // 验证当前线程是否为守护线程,返回 true 则为守护线程  
 daemonThread.isDaemon(); 

 这里有几点需要注意: 


(1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
(2) 在Daemon线程中产生的新线程也是Daemon的。 
(3) 不要认为所有的应用都可以分配给Daemon来进行服务,比如读写操作或者计算逻辑。
因为你不可能知道在所有的User完成之前,Daemon是否已经完成了预期的服务任务。一旦User退出了,可能大量数据还没有来得及读入或写出,计算任务也可能多次运行结果不一样。这对程序是毁灭性的。造成这个结果理由已经说过了:一旦所有User Thread离开了,虚拟机也就退出运行了。 
下面我们写两个测试用例分别测试这两种线程
package org.bird.daemon;

public class MyThread extends Thread {

	public void run() {
		while(true) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("线程名称:" + Thread.currentThread().getName() + "正在运行...");
		}
	}
}
 首先写一个用户线程测试场景
package org.bird.daemon;

public class UserThread {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
       Thread t = new MyThread();
       t.start();
       Runtime.getRuntime().addShutdownHook(new Thread() {
    	   public void run() {
    		   System.out.println("退出jvm");
    	   }
       });
	}

}
 测试结果:

通过测试结果我们发现主线程运行完成后,线程MyThread继续运行,JVM并没有退出。
再写一个守护线程测试场景
package org.bird.daemon;

public class DaemonThread {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Thread t = new MyThread();
		t.setDaemon(true);
		t.start();
		for(int i = 0; i < Integer.MAX_VALUE; i++) {
			
		}
	}

}
 测试结果:

通过测试结果我们发现主线程运行完成后,线程MyThread停止,JVM退出。
 
为什么要用守护线程?
我们知道静态变量是ClassLoader级别的,如果Web应用程序停止,这些静态变量也会从JVM中清除。但是线程则是JVM级别的,如果你在Web 应用中启动一个线程,这个线程的生命周期并不会和Web应用程序保持同步。也就是说,即使你停止了Web应用,这个线程依旧是活跃的。正是因为这个很隐晦的问题,所以很多有经验的开发者不太赞成在Web应用中私自启动线程。
  • 大小: 11.2 KB
  • 大小: 10.4 KB
分享到:
评论

相关推荐

    Java 多线程学习总结6

    在“Java多线程学习总结6”这个主题中,我们可以深入探讨Java多线程的实现、管理及优化。下面将详细阐述相关知识点。 1. **线程的创建方式** - **继承Thread类**:自定义类继承Thread类,并重写run()方法,创建...

    corejava多线程学习总结.pdf

    ### CoreJava多线程学习总结 #### 一、基本概念 多线程是现代软件开发中非常重要的一个概念,尤其在Java这样的高级编程语言中,它使得程序能够更高效地利用计算机资源,实现并发处理任务。为了更好地理解CoreJava...

    Java多线程编程总结

    - 守护线程是在JVM中为其他线程提供服务的线程,当所有非守护线程结束时,JVM也会退出。 #### 八、Java线程:线程的同步-同步方法与同步块 1. **同步方法** - `synchronized` 关键字可用于修饰方法,确保同一...

    java多线程编程总结

    **守护线程**:守护线程是为用户线程服务的,当所有非守护线程结束时,程序也会自动结束。 #### 八、Java线程:线程的同步-同步方法与同步块 - **同步方法** 通过在方法签名前添加 `synchronized` 关键字,可以...

    java daemon 守护线程实例

    java daemon 程序,有助于理解守护线程的概念和使用

    JAVA多线程学习内容

    总的来说,Java多线程学习涵盖了线程的创建、同步、通信、调度以及异常处理等多个方面,深入理解和掌握这些知识点对于提升Java程序的性能和复杂性至关重要。通过阅读提供的"Java多线程.pdf"文档,你可以进一步了解和...

    Java多线程编程总结.doc

    Java中的线程有两种类型:用户线程和守护线程。用户线程由应用程序创建,当所有用户线程结束时,JVM会自动退出。守护线程则服务于用户线程,如垃圾收集器就是守护线程,即使所有用户线程都结束,守护线程仍会继续...

    java多线程Demo

    守护线程是用于支持应用程序运行的后台线程,比如垃圾回收器就是守护线程。当所有非守护线程结束时,即使还有守护线程在运行,JVM也会退出。我们可以使用`setDaemon(true)`方法将线程设置为守护线程。 6. 线程...

    java多线程的讲解和实战

    5. **守护线程(Daemon)**:守护线程是一种不会阻止程序退出的特殊线程,例如JVM的垃圾收集器就是守护线程。通过`setDaemon(true)`方法将线程设置为守护线程。 6. **线程池**:Java提供`ExecutorService`和`...

    java的守护线程+log4日志记录

    很多人对java的线程不是很了解,甚至连守护线程都么有听过,其实很简单,守护线程就是普通的线程,区别再于,他就是类似一个秘书一样,记录着所有的非守护线程的信息等等,守护线程,是指为工作线程做相关统计、汇总...

    深入学习:Java多线程编程

    6. **线程优先级与守护线程**:线程的优先级可以影响其调度顺序,而守护线程则是在所有用户线程结束后才会停止运行的线程,如垃圾收集器。 7. **异常处理**:多线程环境下,如何正确处理和传播异常是另一个重要话题...

    JAVA多线程总结

    守护线程(如垃圾收集器)则不独立于JVM,即使所有用户线程结束,守护线程仍然运行。 **二、Java线程:创建与启动** 1. **定义线程**: - 继承Thread类并重写run()方法。 - 实现Runnable接口,并在run()方法中...

    java 变形金刚中的守护神(守护线程)

    总结来说,Java中的守护线程是那些支持应用程序运行但不阻碍JVM退出的线程。正确使用守护线程可以优化资源管理,提高系统效率,并确保程序能够优雅地退出。在设计和实现多线程应用时,理解并合理利用守护线程的概念...

    Java多线程机制(讲述java里面与多线程有关的函数)

    守护线程(Daemon)是一种不阻止程序退出的线程,如垃圾收集器就是守护线程。当所有非守护线程结束时,程序会终止,即使还有守护线程在运行。 掌握Java的多线程机制对于编写高效、并发友好的应用程序至关重要,它...

    java 多线程示例

    守护线程不会阻止程序的退出,如JVM的垃圾收集器就是守护线程。可以通过`setDaemon(true)`将线程设置为守护线程。 9. **线程池** Java的`ExecutorService`和`ThreadPoolExecutor`类提供了一种更高效的方式来管理...

Global site tag (gtag.js) - Google Analytics