面试高频知识点:2线程 2.1.6线程之间如何通信

news2025/11/2 2:17:56

线程之间的通信方式

在Java中,常见的线程之间通信方式包括:

  1. 共享内存:通过共享内存区域进行通信,即多个线程共享同一块内存区域。通常需要使用同步机制来保护共享数据的一致性。

  2. 消息传递:通过消息传递的方式进行通信,即线程之间通过发送和接收消息来进行信息交换。

下面将分别介绍这两种通信方式,并提供示例代码。

共享内存通信方式

共享内存通信方式是通过共享内存区域进行数据交换的方式。在Java中,可以使用共享对象(例如共享变量)来实现线程之间的通信。常见的共享内存通信方式包括:

  • 使用synchronized关键字对共享变量进行同步;
  • 使用volatile关键字保证共享变量的可见性;
  • 使用Lock和Condition等并发工具类进行线程同步。

下面是一个使用synchronized关键字实现的示例:

class SharedObject {
    private int sharedData;

    public synchronized void setSharedData(int data) {
        sharedData = data;
        notify(); // 通知等待中的线程
    }

    public synchronized int getSharedData() throws InterruptedException {
        while (sharedData == 0) {
            wait(); // 等待数据被设置
        }
        return sharedData;
    }
}

class Producer extends Thread {
    private SharedObject sharedObject;

    public Producer(SharedObject sharedObject) {
        this.sharedObject = sharedObject;
    }

    @Override
    public void run() {
        sharedObject.setSharedData(1);
    }
}

class Consumer extends Thread {
    private SharedObject sharedObject;

    public Consumer(SharedObject sharedObject) {
        this.sharedObject = sharedObject;
    }

    @Override
    public void run() {
        try {
            int data = sharedObject.getSharedData();
            System.out.println("Consumer received data: " + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class SharedMemoryCommunicationExample {
    public static void main(String[] args) {
        SharedObject sharedObject = new SharedObject();
        Producer producer = new Producer(sharedObject);
        Consumer consumer = new Consumer(sharedObject);

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

消息传递通信方式

消息传递通信方式是通过发送和接收消息来进行线程间的通信。在Java中,可以使用wait、notify和notifyAll方法实现线程之间的消息传递。也可以使用阻塞队列(如LinkedBlockingQueue)等并发容器来进行消息传递。

下面是一个使用wait和notify方法实现的示例:

class Message {
    private String content;

    public synchronized void setContent(String content) {
        this.content = content;
        notify(); // 通知等待中的线程
    }

    public synchronized String getContent() throws InterruptedException {
        while (content == null) {
            wait(); // 等待消息被设置
        }
        return content;
    }
}

class Sender extends Thread {
    private Message message;

    public Sender(Message message) {
        this.message = message;
    }

    @Override
    public void run() {
        message.setContent("Hello, Receiver!");
    }
}

class Receiver extends Thread {
    private Message message;

    public Receiver(Message message) {
        this.message = message;
    }

    @Override
    public void run() {
        try {
            String receivedContent = message.getContent();
            System.out.println("Receiver received message: " + receivedContent);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class MessagePassingCommunicationExample {
    public static void main(String[] args) {
        Message message = new Message();
        Sender sender = new Sender(message);
        Receiver receiver = new Receiver(message);

        sender.start();
        receiver.start();
    }
}

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

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

相关文章

文件上传-Webshell

Webshell简介 webshell就是以aspphpjsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页木马后门。 攻击者可通过这种网页后门获得网站服务器操作权限,控制网站服务器以进行上传下载文件、查看数据库、执行命令等… 什么是木马 …

设计模式2-对象池模式

对象池模式,Object Pool Pattern,当你的应用程序需要频繁创建和销毁某种资源(比如数据库连接、线程、socket连接等)时,Object Pool 设计模式就变得很有用。它通过预先创建一组对象并将它们保存在池中,以便在…

压敏电阻简介

压敏电阻 原理 压敏电阻器是一种具有瞬态电压抑制功能的元件,可以用来代替瞬态抑制二极管、齐纳二极管和电容器的组合。压敏电阻器可以对IC及其它设备的电路进行保护,防止因静电放电、浪涌及其它瞬态电流(如雷击等)而造成对它们…

什么是GitOps

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 GitOps 改变了软件和基础设施的管理方式,以 Git 作为管理和自动化应用程序和基础设施整个生命周期的中心枢纽。 它建立在版本控制、协作以及持续集成和…

axios get 请求 url 转码 空格转成+,导致请求失败(前端解决)

问题 GET 请求参数: URL-encoded 后: 浏览器将空格转成了,导致服务报错,返回 400。 解决 在请求拦截器中,对 params 进行处理。 axios.interceptors.request.use((config) > {let url config.url;if (config…

k8s-项目部署案例

一、容器交付流程 在k8s平台部署项目流程 在K8s部署Java网站项目 DockerFile 如果是http访问,需要在镜像仓库配置可信任IP 三、使用工作负载控制器部署镜像 建议至少配置两个标签 一个是声明项目类型的 一个是项目名称的 继续配置属性 资源配额 健康检查 五、使…

elk之search API

写在前面 本文看下查询相关内容,这也是我们在实际工作中接触的最多的,所以有必要好好学习下! 1:查询的分类 主要分为如下2类: 1:基于get查询参数的URI search 2:基于post body的request body search&am…

机器学习1一knn算法

1.基础知识点介绍 曼哈顿距离一般是比欧式距离长的除非在一维空间 拐弯的就是曼哈顿距离 Knn查看前5行数据head(),info看空非空 查看特征对应的类型 Head()默认前5行,head(3)就是前3行数据 Unique()可以查看分类后的结果 csv的…

《学成在线》微服务实战项目实操笔记系列(P1~P83)【上】

史上最详细《学成在线》项目实操笔记系列【上】,跟视频的每一P对应,全系列12万字,涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳,参考这篇,相信会带给你极大启发。 一、前期准备 1.1 项目介绍 P2 To C面向…

Leecode之随机链表的复制

一.题目及剖析 https://leetcode.cn/problems/copy-list-with-random-pointer/ 这个题目的意思就是拷贝一份复杂链表,难点在于它的random指针所指向的空间与拷贝下来的链表之间缺少一种联系,当然可以用遍历链表的方式通过value去找那块空间,不过时间复杂度太高. 二.思路引入 …

hook函数——useState

useState useState是React中的一个Hook函数,用于在函数组件中添加状态。基本使用语法如下: const [state, setState] useState(initialState) state:表示当前状态的值setState:更新状态的函数initialState:初始状态…

Java基础(二十四):网络编程

Java基础系列文章 Java基础(一):语言概述 Java基础(二):原码、反码、补码及进制之间的运算 Java基础(三):数据类型与进制 Java基础(四):逻辑运算符和位运算符 Java基础(五):流程控制语句 Java基础(六)&#xff1…

[Python] 函数详讲

可莉将这篇博客收录在了:《Python》 可莉推荐的一位优质博主:Keven ’ bloghttp://t.csdnimg.cn/6iwnv 跟着可莉一起学习,一篇文章来带你理解Python中的函数的奥秘~ 一、语法格式 定义函数 def 函数名(形参列表):#函数体return 返回值 调用函…

猫头虎分析:如何利用ChatGPT及生成式AIGC提高工作效率 ‍

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

小区创业项目推荐:小投资大回报的店铺类型

作为一位拥有5年鲜奶吧创业经验的自媒体博主,我深知在小区内寻找一个既小投资又能带来大回报的创业项目是多么重要。今天,我要为大家推荐的,正是这样一个项目——鲜奶吧。 一、鲜奶吧:小区内的健康食品新宠 随着健康饮食观念的深…

【SpringBoot】JWT令牌

📝个人主页:五敷有你 🔥系列专栏:SpringBoot ⛺️稳重求进,晒太阳 什么是JWT JWT简称JSON Web Token,也就是通过JSON形式作为Web应用的令牌,用于各方面之间安全的将信息作为JSON对象传输…

mac终端怎么恢复初始设置?图文教程不想看看吗?

某网友说“不小心把终端弄成了这样?请问该怎么办呢?mac终端怎么恢复初始设置?” 其实,这个问题不难,在终端中选择【还原初始值】即可。 Mac终端初始化具体怎么操作?话不多说,图文教程分享给大…

10个简单有效的编辑PDF文件工具分享

10个编辑PDF文件工具作为作家、编辑或专业人士,您可能经常发现自己在处理 PDF 文件。无论您是审阅文档、创建报告还是与他人共享工作,拥有一个可靠的 PDF 编辑器供您使用都非常重要。 10个简单适用的编辑PDF文件工具 在本文中,我们将介绍当今…

前端学习之路(6) npm详解

npm 是什么? npm(node package manager):node.js 的包管理器,用于node插件管理(包括安装、卸载、管理依赖等) ,npm 是随同 node.js 一起安装的包管理工具,能解决 node.j…

Redis 基本认识

文章目录 Redis八个特性Redis应用场景Redis应用缺陷Redis使用流程 Redis八个特性 速度快 原因: ① 单线程,避免了多线程竞争(如加锁/解锁)的时间开销 ② redis的数据存放在内存中 ③ 使用C语言编写,C语言更方便操做硬件 ④ Redis 源码优秀 利用键值对存…