JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java 17 多线程中的守护线程

wys521 2024-11-23 23:46:22 精选教程 21 ℃ 0 评论

Java 17 多线程中的守护线程

在 Java 的线程中,线程可以分为两类,一是用户线程,也被称为非守护线程。另外一种是守护线程。



那什么是守护线程呢?

守护线程是一种特殊的线程。当进程中不存在非守护线程时,则守护线程自动销毁。典型的守护线程的用法就是垃圾回收线程,当进程中没有了非守护的线程,则垃圾回收线程也就没有存在的必要了,自动销毁了。

首先创建一个线程类。代码如下:

class DaemonThread extends Thread {

    @Override
    public void run() {
        int index = 0;
        System.out.println("是否是守护线程: " + this.isDaemon());
        try {
            while (true) {
                TimeUnit.MILLISECONDS.sleep(300);
                System.out.println(++index);
            }
        } catch (InterruptedException e) {

        }
    }
}

测试代码如下:

import java.util.concurrent.TimeUnit;

public class Thread12 {
    public static void main(String[] args) throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + " : " + Thread.currentThread().isDaemon());
        DaemonThread daemonThread = new DaemonThread();
        daemonThread.setDaemon(true);
        daemonThread.start();
        // 这里等待 1 秒钟,是为了更好的查看守护线程的生命周期。
        // 要不然太快的结束主线程,新启动的线程就还没有启动起来也就看不到效果了
        TimeUnit.SECONDS.sleep(1); 
        System.out.println(Thread.currentThread().getName() + "线程结束, 守护线程也会结束。"); 
    }
}

完整代码

运行效果如下:

程序在 1 秒钟结束,DaemonThread 线程设置了为守护线程,所以在程序结束以后, while(true) 也被关闭。为了演示效果,线程中睡眠了 300 毫秒。1 秒钟 只有 3 个完整的毫秒,所以只会显示 1,2,3 的值。

需要注意 setDaemon 方法。设置守护线程的方法。

方法的定义如下:

public final void setDaemon(boolean on)

如果线程处于激活状态就会出现 IllegalThreadStateException 的异常。

演示效果如下:

需要注意的是,虽然会出现异常,但是并不会终止子线程的运行。

守护线程的知识点就先写到这,下面因为篇幅不够, 说说与多线程有关的两个名词。

思考: 并发和并行。

让我这个吃货给你说下用吃饭来说并发的概念。

中午要吃午饭了,饭桌上有媳妇和孩子。我吃了馒头,炒牛肉,炖鸡蛋。我只能一口馒头,一口菜,然后再来一点炖鸡蛋。这个就叫做并发。

这个时候, 同样是 2 个菜,一个主食,媳妇吃了炒牛肉, 我吃了馒头,孩子吃了炖鸡蛋。这个事情是同时发生的,这就叫做并行。

一个人(CPU)”同时”做多件事就是并发。同时:同一时间段内。

多个人(多核 CPU)”同时”做多件事就是并行。同时:同一时间点上。

所以只有在多 CPU 上才会出现并行。一个 CPU 的时候, 只能抢占资源, 谁抢占了谁执行。这样造成了看似在同时做多件事的感觉。可以把并发看成是逻辑上的同时发生。而并行是物理上的同时发生。

并行,相同的资源分配上,速度更快。

并发,相同的资源上,需要更多的时间处理多个事情。

这里不要纠结二义性。说我技术好, 比并行的干的还快。你们一周完成一个项目, 我两天就可以完成。不要这么卷。也不是这样对比的。你奔腾 2 代的 CPU 能干过 i7 嘛, 对不。要在同一资源上来比较,才有对比的意义。否则,别人的起点是一生都赶超不了的!咳咳。

具体的两个名词的使用方式。后续在进行举例子了。 这里只是先有个眼缘,让你下次再次遇到的时候不会略显陌生。毕竟很多知识点都是在潜移默化下觉得理所当然。

感谢您的阅读。关注,点赞,收藏。



本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表