java中线程分为非守护线程(用户线程)和守护线程(后台线程)
一、setDaemon(boolean on)
java线程中对于守护线程的使用主要是依靠setDaemon(boolean on)方法
方法作用: 将此线程设置为守护线程
守护线程使用上与普通线程没有区别, 但是在结束上有一点不同, 当一个进程中所有的普通线程都结束时, 进程就会结束, 此时所有正在运行的守护线程都会被强制杀掉(但是因为java虚拟机停止需要一定时间, 可能就不会出现立马将守护线程杀掉)
注意事项:
1. 设置守护线程的时候, 需要先设置守护现场, 再启动线程.否则会报错, 并且还是以普通线程来执行.
2. 虚拟机必须确保用户线程执行完毕
- 比如说我们的main主线程就是用户线程,当我们的 main() 执行完毕程序就结束了
3. 虚拟机不用等待守护线程执行完毕
- 比如说 gc() 垃圾回收线程就是守护线程,虚拟机不需要等待他执行完毕,我们不需要管他甚至都看不见他,虚拟机只要等待正常的用户线程执行结束了就会停止
4. 守护线程的作用如:后台记录操作日志、监控内存、垃圾回收等等......
二、代码演示
package com.softeem.wolf.thread;
import java.util.Calendar;
import java.util.GregorianCalendar;
/**
* Created by 苍狼
* Time on 2022-09-08
*/
public class ThreadTest {
public static void main(String[] args){
Thread thread01 = new Thread("thread01"){
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+"线程目前的执行时间是:"+new GregorianCalendar().get(Calendar.SECOND));
if (i==10){
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("thread01是--->"+i);
}
}
};
Thread thread02 = new Thread("thread02"){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"线程目前的执行时间是:"+new GregorianCalendar().get(Calendar.SECOND));
if (i==5){
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("thread02--->是"+i);
}
}
};
thread01.setDaemon(true);
thread01.start();
thread02.start();
System.out.println("主线程执行完毕....");
}
}
运行结果
分析: 因为thread01线程被设置为守护线程, 所以当thread02线程执行完了之后, thread01按道理来说应该结束运行, 但是因为java虚拟机结束还是需要一段时间, 所以thread01线程又执行了一会就终止运行了(thread01线程并没有完全执行完), 程序就执行结束了,