多线程中守护线程的使用

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线程并没有完全执行完), 程序就执行结束了, 

猜你喜欢

转载自blog.csdn.net/m0_50370837/article/details/126771599