相信学习过java的同学对守护线程这个词都不陌生,下面我就会详细来介绍一下守护线程的使用方式。
下面请大家先来看一下这段简单的多线程代码。
public class DeamonThread {
public static void main(String[] args) {
Thread t = new Thread() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "running");
Thread.sleep(10_000);
System.out.println(Thread.currentThread().getName() + "done");
} catch (Exception e) {
e.printStackTrace();
}
}
};
t.start();
System.out.println("main done");
}
}
这段代码定义一个线程t,执行main函数的时候,main线程会先退出,而t线程因为定义了休眠10s所以main线程执行完退出的时候它还是在继续执行。直到t执行完成整个application才会完全退出。
下面我们给这段代码加一个属性t.setDaemon(true);
public class DeamonThread {
public static void main(String[] args) {
Thread t = new Thread() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "running");
Thread.sleep(10_000);
System.out.println(Thread.currentThread().getName() + "done");
} catch (Exception e) {
e.printStackTrace();
}
}
};
t.setDaemon(true);
t.start();
System.out.println("main done");
}
}
设置了Daemon这个属性t就会变成一个守护线程,当main执行结束以后t也不会再继续执行。
下面举一个小例子,我们在建立一些网络长连接的时候,通常需要定时性的发送一些心跳包来确保连接的正常。而当这个网络长 连接关闭的时候,我们需要这个发送心跳包的线程也一起关闭。这个时候守护线程就起到了至关重要的作用。请看以下代码
public class DeamonThread {
public static void main(String[] args) {
// t 线程模拟网络长连接
Thread t = new Thread(() -> {
// innerThread 线程模拟发送心跳的线程
Thread innerThread = new Thread(() -> {
try {
while(true) {
System.out.println("发送心跳");
Thread.sleep(1_000);
}
} catch (Exception e) {
e.printStackTrace();
}
});
innerThread.setDaemon(true);
innerThread.start();
try {
Thread.sleep(1_000);// 模拟长连接1秒以后就退出
System.out.println("T Thread done");
} catch (Exception e) {
e.printStackTrace();
}
});
t.start();
}
}
假如innerThread线程不设置Daemon属性则t线程执行完毕以后,innerThread依然会一直执行。
以上就是对守护线程使用的一个小例子,有自己见解的同学欢迎在下面留言讨论