别再犯这些Java并发编程的常见错误!你中了几个?

在这里插入图片描述

你好,我是忆~遂愿,全网2w+粉丝,《遂愿盈创》社群主理人。
副业启航① | 遂愿盈创(对副业感兴趣免费可入,多种赚钱实战项目等你来,一起探寻副业快速变现的途径;以及对接互联网大厂商务合作,一起来搞点小外快,认识更多互联网大咖)
目前群里已经带很多小伙伴(大部分大学生)变现几百块啦,程序员搞副业有额外加成~
对副业感兴趣可+V : suiyuan2ying 拉你进群。

文章目录

    • 1 什么是守护线程,它的使用场景是什么?如何创建守护线程 ?
    • 2 什么是 Thread 的中断标志?怎么设置和检查它?
    • 3 Thread 的中断标志与 InterruptedException 有什么关系?
    • 4 Object类的 wait,notify 和 notifyAll 方法的目的是什么 ?

1 什么是守护线程,它的使用场景是什么?如何创建守护线程 ?

想象一下,一个大型音乐会。音乐会的主要演出是乐队的表演,这就是主线程。乐队在舞台上演奏音乐,吸引观众的注意。舞台的清洁工则是后台支持人员,他们的工作是不断清理舞台上的杂物,确保乐队的演出能够顺利进行。清洁工并不要求乐队完成演出后再开始工作,而是随时在后台默默地工作。当音乐会结束时,清洁工也会跟着结束,不会再继续工作。

守护线程是指那些在后台运行,支持应用程序的主要任务的线程。它们的存在目的是提供必要的服务,比如垃圾回收或定时任务或定期清理缓存或监控系统状态,这些线程在应用程序的其他部分完成时会自动结束。

一个日志记录线程可以作为守护线程,在应用程序运行期间持续记录日志,而不会阻止应用程序的结束。

创建守护线程很简单,只需要设置线程的守护标志。在 Java 中,线程的守护状态通过 Thread.setDaemon(true) 方法设置。

public class DaemonThreadExample {
    public static void main(String[] args) {
        Thread daemonThread = new Thread(() -> {
            while (true) {
                // 会每秒打印一行信息
                System.out.println("守护线程正在运行...");
                try {
                    // 守护线程失眠 1 秒
                    Thread.sleep(1000); 
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });

        // 设置为守护线程
        daemonThread.setDaemon(true); 
        // 启动守护线程
        daemonThread.start(); 

        try {
            // 主线程休眠 5 秒
            Thread.sleep(5000); 
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        // 主线程睡眠 5 秒后结束,这时守护线程也会随着主线程的结束而终止
        System.out.println("主线程结束");
    }
}

2 什么是 Thread 的中断标志?怎么设置和检查它?

想象一下,一个工人在工地上忙碌地工作。他的任务是修建一条道路,工地上设有一个“停工指示牌”,这个指示牌用来告诉工人是否需要停下来并等待进一步的指示 ,当工人看到这个指示牌上写着“停工”时,他就知道需要暂时停止手头的工作。

线程的中断标志是一种机制,用于通知线程它应该停止当前的工作并退出,线程的中断标志并不直接终止线程,而是提供了一种与线程交互的方式,让线程可以在适当的时候响应终止请求。

每个线程都有一个中断标志,这个标志可以被设置、检查或清除。中断标志的状态可以通过两个主要的方法来操作:Thread.interrupt()Thread.isInterrupted()

线程的中断标志可以通过调用 Thread.interrupt() 方法设置,当这个方法被调用时,线程的中断标志被标记为 true

不过,仅仅设置中断标志并不会立即停止线程的执行,线程需要在自己的代码中定期检查中断标志,并做出响应。

Thread thread = new Thread(() -> {
    // 检查线程的中断标志
    while (!Thread.currentThread().isInterrupted()) {
        // 执行一些工作
        System.out.println("线程正在运行...");
        try {
            // 模拟工作
            Thread.sleep(1000); 
        } catch (InterruptedException e) {
            // 捕获到中断异常时,将线程的中断标志重新设置为 true
            Thread.currentThread().interrupt();
        }
    }
});

如果线程正在执行 Thread.sleep()Object.wait()Thread.join() 等方法时被中断,这些方法会抛出 InterruptedException 异常。

在捕获到这个异常后,应该重新设置中断标志,以确保中断信号能够被正确处理。这个动作通过 Thread.currentThread().interrupt() 方法完成。

要设置线程的中断标志,可以在其他线程中调用 Thread.interrupt() 方法。

Thread thread = new Thread(() -> {
    // 工作线程中的循环会因为 isInterrupted() 返回 true 而结束,从而使线程终止
    while (!Thread.currentThread().isInterrupted()) {
        System.out.println("线程正在运行...");
        try {
            // 线程被阻塞,等待 10 秒
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // 捕获到中断异常,线程被中断
            System.out.println("Thread was interrupted!");
            // 保持中断标志状态
            Thread.currentThread().interrupt(); 
        }
    }
});

thread.start();
try {
   // 让线程运行一段时间,然后中断它
   Thread.sleep(1000);
   thread.interrupt();
} catch (InterruptedException e) {
   e.printStackTrace();
}

3 Thread 的中断标志与 InterruptedException 有什么关系?

线程的中断标志与 InterruptedException 紧密相关,每个线程都有一个中断标志,用来指示线程是否应该停止当前的操作。当这个标志被设置为中断时,线程就会响应这个请求。

当线程执行一些可能会被中断的操作,比如 Thread.sleep()Object.wait()Thread.join() 时,它们会被阻塞。这时候,如果其他线程调用了 interrupt() 方法来中断这个线程,那么这些操作会抛出一个 InterruptedException,这是一个特殊的异常,表示线程在被中断的过程中被打断了。

抛出 InterruptedException 时,线程的中断标志会被清除,意味着线程已经知道中断发生了,但它需要处理这个异常,处理完成后,线程可以检查其中断标志,决定如何继续运行或者是否终止。

具体Demo如上2中所示

4 Object类的 wait,notify 和 notifyAll 方法的目的是什么 ?

Object 类的 waitnotifynotifyAll 方法用于线程间的协调和通信,这些方法通常在多线程编程中用于控制线程的执行顺序。

wait 方法使得调用它的线程进入等待状态,直到其他线程调用了 notifynotifyAll 方法,这个等待过程是有条件的,通常在线程需要等待某种条件发生时使用。使用 wait 方法的线程会释放它所持有的锁,从而允许其他线程获得这个锁并执行其操作。

notify 方法会唤醒在对象的监视器上等待的一个线程。如果有多个线程在等待同一个对象的监视器,notify 只会唤醒其中一个线程,但无法保证具体是哪一个线程;如果多个线程都在等待,则唤醒哪个线程是不确定的。

notifyAll 方法则会唤醒在对象的监视器上等待的所有线程。这意味着所有等待的线程都会被唤醒,然后争夺监视器的控制权,如果有多个线程在等待,则它们都会被唤醒,接下来所有被唤醒的线程会尝试重新获得锁,并继续执行。

展示了这些方法如何在实际应用中协作

public class SharedResource {
    private boolean condition = false;

    public synchronized void waitForCondition() {
        while (!condition) {
            try {
                // 进入等待状态,直到 condition 为 true
                wait();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
        // 条件满足后继续执行
        System.out.println("Condition met, proceeding...");
    }

    public synchronized void setConditionTrue() {
        condition = true;
        // 通知等待中的线程条件已经满足
        notifyAll();
    }
}

public class Example {
    public static void main(String[] args) {
        SharedResource resource = new SharedResource();

        // 创建两个线程,它们将等待条件的变化
        Thread waiter1 = new Thread(() -> resource.waitForCondition());
        Thread waiter2 = new Thread(() -> resource.waitForCondition());

        waiter1.start();
        waiter2.start();

        try {
            // 主线程等待一段时间,然后设置条件为 true
            Thread.sleep(1000);
            resource.setConditionTrue();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

通过这种方式,可以实现线程之间的协调,使得一个线程可以通知其他线程某些条件已经发生,从而提高多线程程序的效率和协调性。

不要等待机会,而要创造机会

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/895425.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLO11改进 | 主干网络 | 将backbone替换为Swin-Transformer结构【论文必备】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 本文给大家带来的教程是将YOLO11的backb…

二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)

一、目的 实时数仓用的是ClickHouse,为了避免Hive还要清洗数据,因此就直接把ClickHouse中清洗数据同步到Hive中就行 二、所需工具 ClickHouse:clickhouse-client-21.9.5.16 Kettle:kettle9.2 Hadoop:hadoop-3.1.3…

AI金融攻防赛:YOLO理论学习及赛题进阶思路(DataWhale组队学习)

引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何在金融场景凭证篡改检测中应用YOLO算法。我们将从模型概述、数据准备、训练流程以及模…

基于springboot的在线考试与学习交流网页

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的,前后端分离。 开发语言:Java数据库:MySQL技术:…

1024程序员节 | 一个机械专业的牛马转行牛码的经历

1024程序员节 | 一个机械专业的牛马转行牛码的经历 从本科到研究生 在二进制构筑的计算机世界里,1024是技术人最熟悉的“整数”。又到了一年一度的程序员节,时间过得很快,2022年毕业,转眼间毕业了2年了。本硕机械专业的毕业的职…

基于SpringBoot的旅游网站的设计与实现

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的,前后端分离。 开发语言:Java数据库:MySQL技术:…

SqlDbx客户端连接服务器Oracle数据库

查了很多文章,介绍的不对,走了好多弯路,最后整理一下,供参考 一、下载Oracle客户端 1、SqlDbx如果是32位的,客户端也要下载32位的 2、Oracle客户端版本要和服务端版本一致(本例用的是12.1.0.2.0&#xff…

kebuadm部署k8s集群

官方文档: Installing kubeadm | Kubernetes 切记要关闭防⽕墙、selinux、禁用交换空间, cpu核⼼数⾄少为2 内存4G kubeadm部署k8s⾼可用集群的官方文档: Creating Highly Available Clusters with kubeadm | Kubernetes 你需要在每台…

Elasticsearch是做什么的?

初识elasticsearch 官方网站:Elasticsearch:官方分布式搜索和分析引擎 | Elastic Elasticsearch是做什么的? Elasticsearch 是一个分布式搜索和分析引擎,专门用于处理大规模数据的实时搜索、分析和存储。它基于 Apache Lucene …

python语言入门必须要学习的模块化编程案例游戏---画图案例(三)【源码大全】

彩虹五角星 import turtle #引用turtle库 q turtle.Pen() #构造画笔 turtle.bgcolor("black") …

windows mysql 8.0版本重置root密码

1.停止mysql服务 以管理员运行cmd 2.安全模式启动 mysqld --console --skip-grant-tables --shared-memory 3.修改密码 再开个cmd窗口就可以进入了:mysql 先进入mysql database:use mysql 修改密码:ALTER USER rootlocalhost IDENTIFIED …

数据链路层数据帧格式及网络层IP数据包格式

数据帧格式 前导码:进入物理层之前的缓冲区,包含的是7个字节(56比特)交替出现的0和1,作用:提醒接受系统有帧到来,并且使它与输入定时同步 帧起始定界符:1字节(8比特&…

《深度学习》【项目】自然语言处理——情感分析 <下>

目录 一、了解项目 1、任务 2、文件内容 二、续接上篇内容 1、打包数据,转化Tensor类型 2、定义模型,前向传播函数 3、定义训练、测试函数 4、最终文件格式 5、定义主函数 运行结果: 一、了解项目 1、任务 对微博评论信息的情感分…

基础IO -- 理解文件(2)

目录 三:理解文件 1.先用和认识系统调用的文件操作 a. 标记位传参的理解 b.文件打开后权限 c. 关闭文件 d. 向文件里写入 2.引入文件操作符fd 3.理解fd 4.Linux下一切皆文件 5.解决前面衍生出的一些问题 C语言FILE*的理解 C语言为什么这么做 三&#xff…

视觉检测解决方案

视觉检测解决方案是一种利用计算机视觉技术模拟人类视觉功能,对工业产品进行非接触式的图像采集、处理与分析,以实现自动化检测、识别与测量的过程。以下是朗观视觉小编对视觉检测解决方案的详细阐述: 一、技术原理 视觉检测解决方案主要基于…

21世纪当代国学易经起名大师颜廷利:全球知名哲学家思想家

融合儒道精髓,东方智慧倡和谐与品德,道家无为而治显自然之道。21世纪全球最具影响力的思想家颜廷利哲学深思,西方哲学则重人本、实用与理性,科学思维引领实证探索,共绘智慧新篇章。 当代知名哲学家思想家教育家颜廷利的…

前端html css js 练习巩固沉淀2

做一个这样的特效 相当于步骤一样的样式逻辑 我直接粘贴代码了 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

【02】Windows特殊权限-Trustedinstaller

知识点&#xff1a; “TrustedInstaller” 是 Windows 操作系统中的一个特殊账户&#xff0c;用于管理和保护重要的系统文件。它是 Windows 模块安装程序 (Windows Modules Installer) 的一部分&#xff0c;负责安装、修改和删除 Windows 更新和可选组件。默认情况下&#xff…

【C++篇】领会C++标准库:STL

文章目录 前言 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

5、JavaScript(四) ajax+js高级+BOM

25.ajax : 前端向后端异步的取数据而无需刷新页面的技术 1 公司中的整体工作流程 1、项目开发的流程 每个职位该做的工作&#xff1a; 产品经理&#xff1a;提需求的 与客户沟通 画出原型图给程序员使用 UI设计师&#xff1a;美化 替换UI框架&#xff1a;antd element-ui e…