守护线程与普通线程的唯一区别是:当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)
所以setDeamon(true)的唯一意义就是告诉JVM不需要等待它退出,让JVM喜欢什么退出就退出吧,不用管它。
//下面是一个例子
final
void setDaemon(
boolean on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。
该方法首先调用该线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)。
参数:
on - 如果为
true,则将该线程标记为守护线程。
抛出:
IllegalThreadStateException - 如果该线程处于活动状态。
SecurityException - 如果当前线程无法修改该线程。
另请参见:
isDaemon(), checkAccess()
* Java线程:线程的调度-守护线程
*
* @author leizhimin 2009-11-4 9:02:40
*/
public
class Test {
public
static
void main(String[] args) {
Thread t1 =
new MyCommon();
Thread t2 =
new Thread(
new MyDaemon());
t2.setDaemon(
true);
//设置为守护线程
t2.start();
t1.start();
}
}
class MyCommon
extends Thread {
public
void run() {
for (
int i = 0; i < 5; i++) {
System.out.println(
"线程1第" + i +
"次执行!");
try {
Thread.sleep(7);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyDaemon
implements Runnable {
public
void run() {
for (
long i = 0; i < 9999999L; i++) {
System.out.println(
"后台线程第" + i +
"次执行!");
try {
Thread.sleep(7);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程1第0次执行!
线程1第1次执行!
后台线程第1次执行!
后台线程第2次执行!
线程1第2次执行!
线程1第3次执行!
后台线程第3次执行!
线程1第4次执行!
后台线程第4次执行!
后台线程第5次执行!
后台线程第6次执行!
后台线程第7次执行!
Process finished with exit code 0