守护线程是什么?
Java线程分为用户线程和守护线程。
守护线程是程序运行的时候在后台提供一种通用服务的线程。所有用户线程停止,进程会停掉所有守护线程,退出程序。
Java中把线程设置为守护线程的方法:在 start 线程之前调用线程的 setDaemon(true) 方法。
注意:
public class TestDaemonThread {
public static void main(String[] args) {
testDaemonThread();
}
public static void testDaemonThread() {
Thread t = new Thread() {
@Override
public void run() {
//创建线程,校验守护线程内创建线程是否为守护线程
Thread t2 = new Thread() {
@Override
public void run() {
System.out.println("t2 : " + (Thread.currentThread().isDaemon() ? "daemon thread" : "non-daemon thread"));
}
};
t2.start();
//当所有用户线程执行完,守护线程会被直接杀掉,程序停止运行
int i = 1;
while(true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t : " + (Thread.currentThread().isDaemon() ? "daemon thread" : "non-daemon thread") + " , time : " + i);
if (i++ >= 10) {
break;
}
}
}
};
// t.start(); //setDaemon(true) 必须在 start() 之前设置,否则会抛出IllegalThreadStateException异常,该线程仍默认为用户线程,继续执行
t.setDaemon(true);
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行结果:
t2 : daemon thread
t : daemon thread , time : 1
t : daemon thread , time : 2
结论:
Exception in thread "main" t2 : non-daemon thread
java.lang.IllegalThreadStateException
at java.lang.Thread.setDaemon(Thread.java:1359)
at constxiong.interview.TestDaemonThread.testDaemonThread(TestDaemonThread.java:42)
at constxiong.interview.TestDaemonThread.main(TestDaemonThread.java:6)
t : non-daemon thread , time : 1
t : non-daemon thread , time : 2
t : non-daemon thread , time : 3
t : non-daemon thread , time : 4
t : non-daemon thread , time : 5
t : non-daemon thread , time : 6
t : non-daemon thread , time : 7
t : non-daemon thread , time : 8
t : non-daemon thread , time : 9
t : non-daemon thread , time : 10
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/181562.html原文链接:https://javaforall.cn