Java多线程 -- 守护线程(daemon)

守护线程的说明

Java线程可以被标记为守护线程(daemon)。守护线程与非守护线程的区别主要是它们对于Java程序退出的影响。Java程序在以下几种情况下会退出:

  • Runtime.exit方法被调用
  • 所有非守护线程已经结束,即使这时候还存在守护线程,Java程序也会退出

创建线程的时候,如果其父线程是守护线程,则它自动成为守护线程。如果其父线程不是守护线程,那么可以在启动该线程之前调用setDaemon设置该线程为守护线程。要注意必须在启动之前调用,否则会抛出异常:

	if (isAlive()) {
	    throw new IllegalThreadStateException();
	}

 守护线程的用途

守护线程通常用于执行一些后台作业,例如在你的应用程序运行时播放背景音乐,在文字编辑器里做自动语法检查、自动保存等功能。Java的垃圾回收也是一个守护线程。守护线程的好处就是你不需要关心它的结束问题。例如你在你的应用程序运行的时候希望播放背景音乐,如果将这个播放背景音乐的线程设定为非守护线程,那么在用户请求退出的时候,你不仅要退出主线程,还要通知播放背景音乐的线程退出;如果设定为守护线程则不需要了。

 

以下内容来自于: oreilly.com -- Exploring Java: Threads
Daemon threads are primarily useful in standalone Java applications and in the implementation of the Java system itself, but not in applets. Since an applet runs inside of another Java application, any daemon threads it creates will continue to live until the controlling application exits--probably not the desired effect.

 
翻译如下: 守护线程主要用于独立的Java应用程序和Java系统本身的实现。applet不需要使用守护线程,因为applet本身是在另一个Java应用程序里运行的,任何守护线程都会始终存活,直到控制程序退出,控制程序退出的时候,无论你创建的是守护线程还是非守护线程都会自动退出,这并不是使用守护线程想要的效果,或者说,不使用守护线程也能达到同样的效果。

你可能感兴趣的:(Java多线程)