java多线程(五)线程间通信

news2024/11/26 7:38:08

线程间通信是并发编程中的一个重要概念,它允许多个线程之间交换信息或共享数据。

以下是几种常见的线程间通信方式及其示例:

1. 共享内存

共享内存是最基本的线程间通信方式。多个线程可以访问同一块内存区域,通过读写这块内存区域来实现数据交换和信息共享。

示例(Java)

public class SharedMemoryExample {
    private static int sharedCounter = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                synchronized (SharedMemoryExample.class) {
                    sharedCounter++;
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                synchronized (SharedMemoryExample.class) {
                    sharedCounter++;
                }
            }
        });

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("Final counter value: " + sharedCounter);
    }
}

在这个示例中,两个线程共享一个sharedCounter变量,并通过synchronized块来确保线程安全。

这里加不加synchronized块代码都一样。

2. 消息传递

消息传递是另一种线程间通信方式。线程之间通过发送和接收消息来进行通信。

示例(Java使用wait/notify

public class MessagePassingExample {
    private static final Object lock = new Object();
    private static String message = "";

    public static void main(String[] args) {
        Thread producer = new Thread(() -> {
            synchronized (lock) {
                message = "Hello from Producer";
                lock.notify();
            }
        });

        Thread consumer = new Thread(() -> {
            synchronized (lock) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Received message: " + message);
            }
        });

        producer.start();
        consumer.start();
    }
}

在这个示例中,生产者线程设置一个消息,并通过notify方法通知消费者线程。消费者线程在wait方法中等待,直到收到通知,然后读取并打印消息。

3. 使用并发工具

Java提供了许多并发工具类,如CountDownLatchCyclicBarrierSemaphore等,这些工具类也可以用于线程间通信。

示例(CountDownLatch

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        final CountDownLatch latch = new CountDownLatch(2);

        Thread thread1 = new Thread(() -> {
            System.out.println("Thread 1 is running");
            latch.countDown();
        });

        Thread thread2 = new Thread(() -> {
            System.out.println("Thread 2 is running");
            latch.countDown();
        });

        thread1.start();
        thread2.start();

        latch.await();
        System.out.println("Both threads have finished their execution");
    }
}

在这个示例中,CountDownLatch用于等待两个线程完成它们的执行。每个线程在完成后都会调用countDown方法,当CountDownLatch的计数到达零时,主线程会继续执行并打印消息。

这些示例展示了不同线程间通信方式的基本用法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【问题解决】 PyAutoGUI was unable to import pyscreeze.

解决方案&#xff1a; 打开终端&#xff08;winr 输入cmd回车&#xff09;执行 pip install pyscreeze 再执行&#xff1a;pip install pillow

详解并掌握AXI4总线协议(四)、AXI4_FULL_SLAVE接口源码分析以及仿真验证

系列文章目录 详解并掌握AXI4总线协议&#xff08;一&#xff09;、AXI4-FULL接口介绍 详解并掌握AXI4总线协议&#xff08;二&#xff09;、AXI4_FULL_MASTER接口源码分析以及仿真验证 详解并掌握AXI4总线协议&#xff08;三&#xff09;、基于AXI4_FULL接口的BRAM读写仿真验…

免费好用!阿里这5款AI神器,太强了,打工人必备!(建议收藏)

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 《黑神话&#xff1a;悟空》太爆了&#xff01;最近感觉都要被…

Eclipse部署一个项目到Tomcat和部署多个项目到Tomcat

Eclipse部署一个项目到Tomcat&#xff1a; https://blog.csdn.net/weixin_42334396/article/details/105902994 Eclipse部署多个项目到Tomcat&#xff1a; https://blog.csdn.net/zhanglin1220/article/details/82056185 使用cmd方法强制关闭端口&#xff0c;解除端口占用方法&…

2.初识springcloud

文章目录 1.什么是SpringCloud1.1版本的介绍 2.Spring Cloud实现方案3.环境搭建4.服务拆分原则5.数据准备5.1订单服务5.2商品服务 大家好&#xff0c;我是晓星航。今天为大家带来的是 初识springcloud 相关的讲解&#xff01;&#x1f600; 1.什么是SpringCloud 简单来说&…

Excel表格添加趋势线_数据拟合

一个曲线通过补偿算法拟合为另一个曲线&#xff0c;通常可以通过多种数学和计算技术实现。这里也可以通过Excel表格添加趋势线&#xff0c;然后对趋势线进行拟合&#xff0c;得到趋势预测公式来达到数据补偿。 通过把你需要的数据导入到Excel表格中。 通过 “ 插入 ” --> “…

从单一到互联:KNX网关如何改变你的家居生活

从单一到互联&#xff1a;KNX网关如何改变你的家居生活 在科技日新月异的今天&#xff0c;家居生活正经历着一场前所未有的变革。从过去单一、孤立的设备操作&#xff0c;到如今智能、互联的生态系统&#xff0c;KNX网关作为这一转变的关键角色&#xff0c;正悄然改变着我们的日…

探索Unity3D URP后处理在UI控件Image上的应用

探索Unity3D URP后处理在UI控件Image上的应用 前言初识URP配置后处理效果将后处理应用于UI控件方法一&#xff1a;自定义Shader方法二&#xff1a;RenderTexture的使用 实践操作步骤一&#xff1a;创建RenderTexture步骤二&#xff1a;UI渲染至RenderTexture步骤三&#xff1a;…

养宠家庭一定要试 希喂、美的两大品牌宠物空气净化器性能对比

随着养宠家庭的增多&#xff0c;宠物市场上产品也在不断丰富。这段时间最热门的产品非宠物空气净化器莫属&#xff0c;讨论度非常高&#xff0c;大家对它的评价褒贬不一。作为三只毛孩子的家长&#xff0c;它们的毛发清理问题一直令我头大&#xff0c;所以决定试试号称专为吸附…

科技守护健康:氧气检测仪的工作原理与应用深探

科技守护健康&#xff1a;氧气检测仪的工作原理与应用深探 在科技飞速进步的今天&#xff0c;我们身边的许多设备都融入了科技的智慧&#xff0c;其中氧气检测仪便是守护人类健康与安全的重要一环。它以其独特的工作原理&#xff0c;在工业生产、医疗护理等多个领域发挥着至关重…

数字图像处理【15】特征检测——SIFT特征检测

一、引入SIFT算法 上一篇文章我们重温学习了Harris角点检测算法的基本原理&#xff0c;但在实际生产使用Harris检测角点的时候&#xff0c;会发现一个问题&#xff0c;就是用于检测的输入图像的尺寸大小会直接影响到Harris的检测结果。这是为什么呢&#xff1f;主要是Harris角…

引领未来的NVR方案:海思3520D芯片与全套NVR模组源代码解析

随着视频监控技术的发展&#xff0c;NVR&#xff08;网络视频录像机&#xff09;已成为安全保障系统的核心设备。市场上NVR芯片方案主要由几大厂商主导&#xff0c;其中海思35XX系列在中高端市场占据主导地位&#xff0c;特别适用于图像处理和多种应用场景。 我们研发了一款基…

探索提示工程 Prompt Engineering的奥妙

一、探索提示工程 1. 介绍通用人工智能和专用人工智能 人工智能&#xff08;AI&#xff09;可以分为通用人工智能&#xff08;AGI&#xff09;和专用人工智能&#xff08;Narrow AI&#xff09;。AGI是一种能够理解、学习和执行任何人类可以完成的任务的智能。与此相对&#x…

嵌入式学习day17(数据结构)

大纲 数据结构、算法数据结构&#xff1a; 1. 线性表&#xff1a;顺序表、链表&#xff08;单向链表&#xff0c;单向循环链表&#xff0c;双向链表&#xff0c;双向循环链表&#xff09;、栈&#xff08;顺序栈&#xff0c;链式栈&#xff09;、队列&#xff08;循…

得物App白屏优化系列|网络篇

一、背景 图片加载作为重中之重的App体验指标&#xff0c;端侧的白屏问题则是其中最为严重的问题之一。想象一下如果你在浏览交易商品、社区帖子等核心场景下&#xff0c;图片无法完成加载是多么糟糕的体验。 网络作为图片资源加载的最主要来源途径&#xff0c;如果不能够快速…

医疗器械维修零基础也可以学吗?

最近您是不是在纠结&#xff1a;医疗器械维修&#xff0c;零基础能学吗&#xff1f;别担心&#xff0c;答案就在这里&#xff01;亲爱的朋友&#xff0c;零基 础绝对不是您追求医疗器械维修技能的绊脚石。我们有精心设计的课程&#xff0c;就像为您量身打造的成长阶梯。 无论您…

海外销量不错,长城汽车因“重大失信影响恶劣”被南方电网拉黑

《港湾商业观察》施子夫 被南方电网“拉黑”的长城汽车&#xff08;601633.SH&#xff1b;02333.HK&#xff09;最近深陷旋涡。最新的消息是长城汽车道歉了。 8月14日&#xff0c;中国南方电网供应链统一服务平台发布一则公告&#xff0c;公告称&#xff0c;为促进供应商诚信…

C语言之字节对齐

目录 1. 引言2.字节对齐原理3.字节对齐应用4.总结 1. 引言 字节对齐属于编译器的内容&#xff0c;决定数据实际的存放方式。主要有两个作用&#xff1a;1.优化数据储存&#xff0c;减少空间浪费 2.增加数据读取速率&#xff0c;本文将于以上两点展开&#xff0c;简述字节对齐的…

四川正信晟锦:同学借钱不还不回消息

在校园的微风轻拂下&#xff0c;我们彼此以赤诚的心交换着青春的誓言。那些日子里&#xff0c;友情如影随形&#xff0c;金钱在这份单纯中显得微不足道。然而&#xff0c;随着时间的流逝&#xff0c;一桩桩借钱不还的事件悄然滋生&#xff0c;如同夜幕下潜行的阴影&#xff0c;…

bC一体化助力终端动销 单日销量提升5倍

想象一下这样令人振奋的场景&#xff1a;某品牌在短短一天内的销量&#xff0c;竟然达到了过去一周的总销量&#xff01;又或者&#xff0c;一个品牌因其零售店的出色表现&#xff0c;就迅速在一个月内席卷了整个乡镇的所有零售店。 这样的终端动销效果&#xff0c;是否让你心…