Java多线程编程中的线程间通信

news2024/11/25 4:33:27

Java多线程编程中的线程间通信

基本概念:

线程间通信是多线程编程中的一个重要概念,指的是不同线程之间如何协调和交换信息,以达到共同完成任务的目的。


线程间通信的目的

是确保多个线程能够按照一定的顺序和规则进行协作,从而避免数据竞争和并发问题,保证程序的正确性和稳定性。


在多线程环境下,线程间通信通常涉及到以下几种情况:

  1. 共享数据访问: 多个线程需要访问共享的数据,为了避免数据冲突,需要采取合适的同步机制,如锁、信号量等,以确保数据的安全访问。

  2. 等待和通知机制: 通过使用 wait()notify()notifyAll() 方法,线程可以等待某个条件的满足,然后通知其他线程进行相应的操作。这可以用于线程之间的协调和同步。

  3. 线程池和任务队列: 线程池可以有效地管理线程,避免频繁地创建和销毁线程。任务队列用于存储待执行的任务,线程池中的线程可以从队列中取出任务并执行。

  4. 使用 join() 方法: join() 方法可以让一个线程等待另一个线程执行完成。这在需要等待某个线程完成后再继续执行的场景中很有用。

  5. 使用 FutureCallable Future 可以用来获取异步任务的执行结果,而 Callable 可以表示一个可以返回结果的任务。


下面是一个使用 wait()notify() 方法进行线程间通信的简单示例:

class SharedResource {
    private boolean isDataAvailable = false;

    public synchronized void produce() {
        while (isDataAvailable) {
            try {
                wait(); // 等待数据可用
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 生产数据
        isDataAvailable = true;
         System.out.println("生产者生产数据");
        notify(); // 通知等待的消费者线程
    }

    public synchronized void consume() {
        while (!isDataAvailable) {
            try {
                wait(); // 等待数据可用
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 消费数据
        isDataAvailable = false;
       System.out.println("消费者消费数据");
        notify(); // 通知等待的生产者线程
    }
}

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

        // 创建生产者线程
        Thread producerThread = new Thread(() -> {
            while (true) {
                resource.produce(); // 生产数据
            }
        });

        // 创建消费者线程
        Thread consumerThread = new Thread(() -> {
            while (true) {
                resource.consume(); // 消费数据
            }
        });

        producerThread.start(); // 启动生产者线程
        consumerThread.start(); // 启动消费者线程
    }
}

​ 在这个示例中,SharedResource 类表示一个共享资源,其中的 produce()consume() 方法分别用于生产和消费数据。使用 synchronized 关键字,确保了在访问共享资源时的同步性。生产者线程和消费者线程通过 wait()notify() 方法进行通信,实现了线程间的协调和同步。
输出结果如下:在这里插入图片描述
这个示例中使用了两个线程,一个生产者线程和一个消费者线程,它们通过 wait() 和 notify() 方法进行通信。由于这是一个无限循环的示例,所以我们只能看到一部分输出结果,而不是整个执行过程的输出。
PS:这只是一个简单的示例,实际应用中可能涉及更复杂的线程间通信场景。

作者:Stevedash

发表于:2023年8月14日 17点03分

来源:Java 多线程编程 | 菜鸟教程 (runoob.com)

注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。

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

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

相关文章

二、linux虚拟机配置中文输入法和如何下载软件

(一)配置中文输入法: 1、sudo apt-get install fcitx,安装fcitx框架,安装完成之后,选择该框架 2、接下来输入sudo apt-get install fcitx fcitx-googlepinyin,安装谷歌输入法之后,重…

分布式 - 消息队列Kafka:Kafka 消费者消息消费与参数配置

文章目录 1. Kafka 消费者消费消息01. 创建消费者02. 订阅主题03. 轮询拉取数据 2. Kafka 消费者参数配置01. fetch.min.bytes02. fetch.max.wait.ms03. fetch.max.bytes04. max.poll.records05. max.partition.fetch.bytes06. session.timeout.ms 和 heartbeat.interval.ms07.…

ubuntu环境上搭建ros2

环境搭建 设置系统区域。 首先需要确保安装环境支持 UTF-8 格式 sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-8 locale添加 ROS2 的代码仓库 设置你的sources.list&#xff0…

leetcode 面试题 02.05 链表求和

⭐️ 题目描述 🌟 leetcode链接:面试题 02.05 链表求和 ps: 首先定义一个头尾指针 head 、tail,这里的 tail 是方便我们尾插,每次不需要遍历找尾,由于这些数是反向存在的,所以我们直接加起来若…

【Kubernetes】Kubernetes的PV和PVC的用法

PV、PVC 前言一、 存储卷1. emptyDir 存储卷1.1 概念1.2 实例 2. hostPath 存储卷2.1 概念2.2 实例 3. nfs共享存储卷 二、PV 和 PVC1. 概念1.1 PV1.2 PVC1.3 PVC 的使用逻辑1.4 创建机制1.5 PV 和 PVC 的生命力周期1.6 创建及销毁 PV 的流程 2. PV 和 PVC 的创建2.1 查看定义2…

PC-3000 Flash、Flash_Extractor、VNR信号的术语和编号 / 软件教程

PC-3000 Flash、Flash_Extractor、VNR信号的术语和编号 / 软件教程 PC-3000 Flash、Flash_Extractor、VNR信号的术语和编号 PC-3000 Flash、Flash_Extractor、VNR信号的术语和编号 许多客户在解决方案库中阅读整体方案时遇到问题。那么,如何正确读取它们并将内存芯片…

FinOps 应用入门指南

入门指南介绍 什么是 FinOps ? FinOps 是一种云成本管理和优化的解决方案,并为组织、企业、团队提供了系统化的方法论,其中每个人都应该对自己的云资源成本负责。 FinOps 是“Finance”和“DevOps”的合成词,强调业务团队和研发…

因果推断(四)断点回归(RD)

因果推断(四)断点回归(RD) 在传统的因果推断方法中,有一种方法可以控制观察到的混杂因素和未观察到的混杂因素,这就是断点回归,因为它只需要观察干预两侧的数据,是否存在明显的断点…

秒杀库存解决方案

电商系统中秒杀是一种常见的业务场景需求,其中核心设计之一就是如何扣减库存。本篇主要分享一些常见库存扣减技术方案,库存扣减设计选择并非一味追求性能更佳,更多的应该考虑根据实际情况来进行架构取舍。在商品购买的过程中,库存…

8.14 ARM

1.练习一 .text 文本段 .global _start 声明一个_start函数入口 _start: _start标签,相当于C语言中函数mov r0,#0x2mov r1,#0x3cmp r0,r1beq stopsubhi r0,r0,r1subcc r1,r1,r0stop: stop标签,相当于C语言中函数b stop 跳转到stop标签下的第一条…

Maven 基础之依赖管理、范围、传递、冲突

文章目录 关于依赖管理坐标和 mvnrepository 网站pom.xml 中"引"包 依赖范围依赖传递依赖冲突 关于依赖管理 坐标和 mvnrepository 网站 在 maven 中通过『坐标』概念来确定一个唯一确定的 jar 包。坐标的组成部分有&#xff1a; 元素说明<groupId>定义当前…

2023国赛数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&…

HTB-Keeper

HTB-Keeper 信息收集80端口 lnorgaardroot 信息收集 80端口 80主页给了一个跳转的链接 跟随链接后到了一个登陆界面。 尝试搜索默认密码。 通过账号root:password登录。不知道为什么我登陆了两次才成功。 通过搜索在Admin->Users->Select里面发现了用户信息。 lno…

安全 1自测

常见对称加密算法&#xff1a; DES&#xff08;Data Encryption Standard&#xff09;&#xff1a;数据加密标准&#xff0c;速度较快&#xff0c;适用于加密大量数据的场合&#xff1b; 3DES&#xff08;Triple DES&#xff09;&#xff1a;是基于DES&#xff0c;对一块数据用…

HashMap源码 学习日志

我们先看一下默认的 HashMap的设置 什么是 加载因子&#xff1f; HashMap的底层是哈希表&#xff0c;是存储键值对的结构类型&#xff0c;它需要通过一定的计算才可以确定数据在哈希表中的存储位置&#xff1a; static final int hash(Object key) {int h;return (key nul…

Tree相关

1.树相关题目 1.1 二叉树的中序遍历&#xff08;简单&#xff09;&#xff1a;递归 题目&#xff1a;使用中序遍历二叉树 思想&#xff1a;按照访问左子树——根节点——右子树的方式遍历这棵树&#xff0c;而在访问左子树或者右子树的时候我们按照同样的方式遍历&#xff0…

如何选择适合企业的文档在线管理系统?

在当今数字化时代&#xff0c;企业文档承载了大量的信息和数据&#xff0c;因此选择适合企业的文档在线管理系统至关重要。一个合适的文档管理系统可以提高工作效率、加强信息安全和团队协作能力&#xff0c;下面将介绍如何选择适合企业的文档在线管理系统。 1. 功能需求 首先…

全网小说下载器,只需书名,一键下载(Python爬虫+tkinter 实现)小白实战案例系统教学!

大家好&#xff0c;我是小曼呐 前言 ttkbootstrap是一个基于Python的开源库&#xff0c;用于创建漂亮且交互式的GUI应用程序。它是在Tkinter框架之上构建的&#xff0c;提供了一系列的Widget组件和样式&#xff0c;可以帮助开发者快速构建现代化的用户界面。 今天做的是这个…

JavaScript如何执行语句

目录 语法/词法分析 预编译 解释执行 预编译什么时候发生 js运行三步曲 预编译前奏 预编译步骤 巩固基础练习 语法/词法分析 按语句块的粒度解析成抽象语法树 ,分析该js脚本代码块的语法是否正确&#xff0c;如果出现不正确&#xff0c;则向外抛出一个语法错误&#x…

centos7 部署kubernetes(带自动部署脚本)

目录 一、实验规划 1、规划表 2、安装前宿主机检查 1.配置主机名 2.制作ssh免密&#xff08;VM1中执行&#xff09; 3.修改hosts 文件 4. 修改内核相关参数 5.加载模块 6. 清空iptables、关闭防火墙、关闭交换空间、禁用selinux 7. 安装ipvs与时钟同步 8.配置docker的…