文章目录
什么是线程
线程是指进程中的一个执行流程,一个进程中可以运行多个线程。
Java有两种Thread:
- 守护线程Daemon(守护线程)
- 用户线程User(非守护线程)。
什么是非守护线程(User Thread)
非守护线程包括常规的用户线程或诸如用于处理GUI事件的事件调度线程,Java虚拟机在它所有非守护线程已经离开后自动离开。
什么是守护线程(Daemon Thread)
定义详解
守护线程则是用来服务非守护(用户)线程的
比如Java的垃圾回收机制:GC线程。
如果没有其他的用户线程在运行,那么此时的GC线程就没有要服务的对象了,所以就没有必要继续执行下去,JVM(虚拟机)此时也就会退出了。
拓展
- 一方面:操作系统里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制是构建在JVM的基础之上的,所以说Java平台会把操作系统的底层给屏蔽起来,让它可以在它自己的虚拟的平台里面构造出对 自己有利的机制。
- 另一方面:语言或者说平台的设计者多多少少是受到Unix思想的影响,而守护线程机制又是针对像JVM这样的平台,于是才有了守护线程;
- 守护线程一般在实际的使用中较少,但并非无用。
举几个例子:JVM的垃圾回收、内存管理等线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等。
创建守护线程
setDaemon方法
调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。(守护线程与普通线程写法上基本没什么区别)
方法名称
public final void setDaemon( boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
参数
on :如果值为 true,则将该线程标记为守护线程。
抛出
IllegalThreadStateException - 如果该线程处于活动状态。
SecurityException - 如果当前线程无法修改该线程。
注意要点
- thread.setDaemon(true)必须在thread.start()之前,否则会出现IllegalThreadStateException异常,提示该线程正在处于活动状态。如果线程是守护线程,则isDaemon方法返回true。
- 在Daemon线程中产生的新线程也是Daemon的。
- 不是所有的应用都可以分配给Daemon线程来进行服务。
比如读写操作或者计算逻辑。因为在Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了。
代码示例
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();
}
}
}
}
运行效果
从上面的运行效果可以看出:
前台线程是保证执行完毕的,后台线程还没有执行完毕就退出了。
守护线程与非守护线程的区别
User Thread线程和Daemon Thread守护线程唯一的区别之处就在虚拟机的离开:
当JVM中所有的线程都是守护线程的时候,JVM就可以退出了(如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了);如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)。
举个例子:
守护线程就像小区里的保安 ,里面各种住户(非守护线程),他们是可以同时干着各自的活儿,但是住户们要是都一个个被带走了,那么门口的保安也就没有存在的意义了。