Java多线程:用户进程和守护进程

概念


守护线程与普通(用户)线程的唯一区别是:

当JVM中所有的线程都是守护线程时,JVM就可以退出了;如果还有一个或以上的非守护线程则不会退出。

(以上是针对正常退出,调用System.exit则必定会退出)

所以setDeamon(true)的唯一意义就是告诉JVM不需要等待它退出,让JVM喜欢什么退出就退出吧,不用管它。

使用场景

  • JVM的垃圾回收、内存管理等线程都是守护线程。
  • 还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。

例子


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/***
* 用户线程和守护线程
*
*/
public class UserOrDaemon {
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
2
3
4
5
6
7
8
9
10
11
后台线程第0次执行!
线程10次执行!
线程11次执行!
后台线程第1次执行!
后台线程第2次执行!
线程12次执行!
线程13次执行!
后台线程第3次执行!
线程14次执行!
后台线程第4次执行!
后台线程第5次执行!

从上面的执行结果可以看出:前台线程是保证执行完毕的,后台线程还没有执行完毕就退出了