Java中的线程分为两种类型——守护线程(Daemon Thread)和普通线程(User Thread)。守护线程是一种特殊的线程,它在后台运行,主要用于Java虚拟机的一些特定操作,比如垃圾回收和内存管理等。普通线程指的是用户线程,它是我们常规开发使用的线程。
定义
在Java中通过Thread类的构造函数和setDaemon方法设置线程的daemon属性,来区分普通线程和守护线程。当一个线程被设置为守护线程时,如果用户线程结束,守护线程也会随之结束。若没有用户线程在运行,也就是所有的用户线程都已结束,守护线程也会随之结束。
特点
1. 生命周期
由于守护线程是所有用户线程的服务者,因此它的生命周期也是由用户线程来决定的。当Java虚拟机中只有守护线程在运行时,整个虚拟机就会结束。
2. 被动性
与用户线程不同,当一个守护线程中的任务停止运行时,它自然就会退出。因此守护线程是被动式的,不会像用户线程那样主动运行。
3. 优先级
Java虚拟机中的所有守护线程都是最低优先级的线程。所以在用户线程和守护线程之间分配处理时间时,JVM优先选择运行用户线程。
实例说明
1. 守护线程实例
public class DaemonExample extends Thread {
public void run() {
if (Thread.currentThread().isDaemon()) {
System.out.println("This is the daemon thread");
} else {
System.out.println("This is the user thread");
}
}
public static void main(String[] args) {
DaemonExample daemonThread = new DaemonExample();
daemonThread.setDaemon(true);
daemonThread.start();
}
}
输出结果为:"This is the daemon thread"。在上述代码中,我们先创建一个继承了Thread类的DaemonExample线程类,并在它的run方法里面判断当前线程是否为守护线程。我们在main方法中将DaemonExample线程设置为守护线程并启动。
2. 普通线程与守护线程组合实例
public class NormalDaemonThread extends Thread {
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!Thread.currentThread().isDaemon()) {
System.out.println("This is the user thread");
} else {
System.out.println("This is the daemon thread");
}
}
public static void main(String[] args) {
NormalDaemonThread userThread1 = new NormalDaemonThread();
NormalDaemonThread userThread2 = new NormalDaemonThread();
NormalDaemonThread daemonThread = new NormalDaemonThread();
// 将daemonThread设置为守护线程
daemonThread.setDaemon(true);
daemonThread.start();
// 正常线程开始执行
userThread1.start();
userThread2.start();
}
}
输出结果为:"This is the daemon thread","This is the user thread","This is the user thread"。在这个例子中,我们创建了三个线程对象,其中一个是守护线程,另外两个是用户线程。我们在daemonThread对象中将该线程设置为守护线程并启动,而在userThread1和userThread2对象中,我们没有设置daemon属性,并分别启动这两个线程。结果表明,在这个程序运行过程中,用户线程1和用户线程2都可以完成运行,没有被守护线程所干扰,而守护线程在用户线程都完成运行后,停止了工作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:谈谈Java中的守护线程与普通线程 - Python技术站