java中线程分为非守护线程(用户线程)和守护线程(后台线程)
java线程中对于守护线程的使用主要是依靠setDaemon(boolean on)方法
方法作用: 将此线程设置为守护线程
守护线程使用上与普通线程没有区别, 但是在结束上有一点不同, 当一个进程中所有的普通线程都结束时, 进程就会结束, 此时所有正在运行的守护线程都会被强制杀掉(但是因为java虚拟机停止需要一定时间, 可能就不会出现立马将守护线程杀掉)
注意事项:
1. 设置守护线程的时候, 需要先设置守护现场, 再启动线程.否则会报错, 并且还是以普通线程来执行.
2. 虚拟机必须确保用户线程执行完毕
3. 虚拟机不用等待守护线程执行完毕
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线程并没有完全执行完), 程序就执行结束了,