Java守护线程「建议收藏」

Java守护线程「建议收藏」1、什么是守护线程Java线程分两种:用户线程和守护线程。守护线程,是指在程序运行的时,后台提供一种通用服务的线程。比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。守护线程和用户线程的没有本质的区别,不同之处在于虚拟机的离开;若用户线程已全部退出运行,只剩守护线程存在,虚拟机也即退出。因没有了被守护者,守护线程也就无工作可做,也

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1、什么是守护线程

Java线程分两种:用户线程和守护线程。

守护线程,是指在程序运行的时,后台提供一种通用服务的线程。比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

守护线程和用户线程的没有本质的区别,不同之处在于虚拟机的离开;若用户线程已全部退出运行,只剩守护线程存在,虚拟机也即退出。 因没有了被守护者,守护线程也就无工作可做,也就没有继续运行程序的必要了。

将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意一下几点:

(1)thread.setDaemon(true)须在thread.start()之前设置,不能把正在运行的常规线程设置为守护线程,否则会抛出IllegalThreadStateException异常。

(2) 在Daemon线程中创建的新线程也是Daemon的。

(3) 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。

(4)java多线程编程,偏向使用java自带的多线程框架,比如ExecutorService,但是java的线程池会将守护线程转换为用户线程,所以如果要使用后台线程就不能用java的线程池。

2、代码示例

守护线程类

import lombok.SneakyThrows;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DaemonRunnable implements Runnable {

    @SneakyThrows
    @Override
    public void run() {
        System.out.println("进入守护线程...");

        Integer count = 0;
        while (true) {
            count++;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String time = sdf.format(new Date());
            System.out.println("当前:" + time + " | 守护线程进行中,目前计数至【" + count + "】");
            Thread.sleep(1000);
        }

    }
}

测试类

import java.util.Random;

public class DaemonTest {

    public static void main(String[] args) throws InterruptedException {
        // 守护线程在主线程操作完成后就会自动退出,所以不适合进行读写操作
        DaemonRunnable runnable = new DaemonRunnable();
        Thread thread = new Thread(runnable);
        thread.setDaemon(true);
        thread.start();

        Random random = new Random();
        Integer sec = random.nextInt(10);
        System.out.println("警告:" + sec + "秒后主线程退出");
        Thread.sleep(sec * 1000);
        System.out.println("警告:主线程宣告退出!");
    }

}

测试结果

进入守护线程...
警告:8秒后主线程退出
当前:2021-10-09 15:40:00 | 守护线程进行中,目前计数至【1】
当前:2021-10-09 15:40:01 | 守护线程进行中,目前计数至【2】
当前:2021-10-09 15:40:02 | 守护线程进行中,目前计数至【3】
当前:2021-10-09 15:40:03 | 守护线程进行中,目前计数至【4】
当前:2021-10-09 15:40:04 | 守护线程进行中,目前计数至【5】
当前:2021-10-09 15:40:05 | 守护线程进行中,目前计数至【6】
当前:2021-10-09 15:40:06 | 守护线程进行中,目前计数至【7】
当前:2021-10-09 15:40:07 | 守护线程进行中,目前计数至【8】
警告:主线程宣告退出!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181538.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用docker运行zabbix-server「建议收藏」

    使用docker运行zabbix-server

    2022年2月17日
    55
  • 莫忽视数据中心的可靠性

    莫忽视数据中心的可靠性

    2022年3月6日
    38
  • js Map对象的用法[通俗易懂]

    js Map对象的用法[通俗易懂]第一篇:Map:Map是一组键值对的结构,具有极快的查找速度。举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Array:varnames=[‘Michael’,’Bob’,’Tracy’];varscores=[95,75,85];给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应…

    2022年9月5日
    4
  • 另类走遍美国的生活语言:美国黑话英语大观(详解)

    另类走遍美国的生活语言:美国黑话英语大观(详解)文章来源:生活是语言美国的黑人社会中的帮派问题经常地在绕舌歌曲中被讨论,自然也有许多与帮派相关的黑话会常在绕舌歌中出现,如:O.G.-即OriginalGangster,用来指有案底的帮派份子。redrum-就是谋杀(murder)的意思,只是这里把它反过来写。Rolling60s-一黑帮的支派。set-帮派分支。Settripping-帮派内斗。

    2022年5月12日
    75
  • 索引优缺点

    索引优缺点一、为什么要创建索引呢(优点)?创建索引可以大大提高系统的性能。第一,   通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,   可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,   可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,   在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,   通过使用索引,…

    2022年5月26日
    39
  • 打印纸张尺寸换算_常用纸张尺寸大小对照表

    打印纸张尺寸换算_常用纸张尺寸大小对照表648A3297×420B3353×500C3324×458A4210×297B4250×353C4229×324A5148×210B5176×250C5162×229A6105×148B6125×176C6114×162A774×105B788×125C781×114A852×74B862×88DL110×220A937×52B944×62C7/681×162A1026×37B1031×44A组…

    2022年6月20日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号