Java nio 的线程通信机制线程通信Pipe

Java的Pipe是一种新的线程通信机制,传统的线程通信可以是通过共享内存的方式,socket等方式,而Pipe是通过Java NIO 通信的方式实现共享内存,优点类似于go语言的管道

先上代码

    public static void main(String[] args) throws IOException {
        Pipe open = Pipe.open();
        Pipe.SinkChannel sinkChannel = open.sink();
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(32);
        byteBuffer.clear();
        byteBuffer.put("你好 pipe".getBytes());
        byteBuffer.flip();
        sinkChannel.write(byteBuffer);
        Pipe.SourceChannel source = open.source();
        ByteBuffer byteBuffer1 = ByteBuffer.allocateDirect(32);
        source.read(byteBuffer1);

    }

这段代码我没有开启多线程读写

只讲底层实现

首先 SinkChannel 和 SourceChannel 是两个内部类 这个两个类都有一个SocketChannel 

但是SinkChannel只提供了写方法 SourceChannel提供了读方法,相当于是对原始SocketChannel的一个封装,使其达到了一个SocketChannel 只能读一个SocketChannel 只能写的效果。所以就可以做到线程间通信

  ServerSocketChannel var1 = null;
                SocketChannel var2 = null;
                SocketChannel var3 = null;

                try {
                    ByteBuffer var4 = ByteBuffer.allocate(16);
                    ByteBuffer var5 = ByteBuffer.allocate(16);
                    InetAddress var6 = InetAddress.getByName("127.0.0.1");

                    assert var6.isLoopbackAddress();

                    InetSocketAddress var7 = null;

                    while(true) {
                        if (var1 == null || !var1.isOpen()) {
                            var1 = ServerSocketChannel.open();
                            var1.socket().bind(new InetSocketAddress(var6, 0));
                            var7 = new InetSocketAddress(var6, var1.socket().getLocalPort());
                        }

                        var2 = SocketChannel.open(var7);
                        PipeImpl.RANDOM_NUMBER_GENERATOR.nextBytes(var4.array());

                        do {
                            var2.write(var4);
                        } while(var4.hasRemaining());

                        var4.rewind();
                        var3 = var1.accept();

                        do {
                            var3.read(var5);
                        } while(var5.hasRemaining());

                        var5.rewind();
                        if (var5.equals(var4)) {
                            PipeImpl.this.source = new SourceChannelImpl(Initializer.this.sp, var2);
                            PipeImpl.this.sink = new SinkChannelImpl(Initializer.this.sp, var3);
                            break;
                        }

                        var3.close();
                        var2.close();
                    }

首先初始化一个ServerSocketChannel 然后绑定本地回环地址分配端口号

然后var2通过Open和ServerSocketChannel进行连接 ,紧接着var3通过acceept的方式来接受连接。如此这两个SocketChannel通过ServerSocketChannel建立了连接从而实现了跨线程通信。

而且通信底层使用了直接内存效率会高一些

而且SocketChannel还可以是非阻塞的

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

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

相关文章

智能充电桩网关,构建高效充电网络

近年来我国新能源汽车的增长速度出现明显的上升趋势,但是其充电桩的发展还比较缓慢。目前在充电桩系统设计期间仍存在一些问题,主要表现在充电设施短缺、充电难等问题,这些问题的发生均会在一定程度上限制新能源汽车的发展,这就需…

【papaparse插件】前端预览csv文件

需求:就是可以在前端直接预览csv文件的内容 1.了解csv文件 1.1 csv文件和xlsx、xls文件的异同 首先了解一下csv文件和excel文件(xlsx,xls)有什么异同,简单来说他们都是存储表格数据的文件,csv只能显示较…

【C++/STL】:优先级队列的使用及底层剖析仿函数

目录 💡前言一,优先级队列的使用二,仿函数1,什么是仿函数2,仿函数的简单示例 三,优先级队列的底层剖析 💡前言 优先队列(priority_queue)是一种容器适配器,默认使用vector作为其底层…

改变AI历史的Transformer是如何帮助LLM大模型工作的?看图解密Transformer原理,看不懂算我输!

在过去的几年里,大型语言模型(LLM)的出现,为长达数十年的智能机器构建的探索中带来了巨大的飞跃。 这项基于试图模拟人类大脑的研究技术,也在近几年催生了一个新领域——Generative AI 生成式人工智能,简单理解就是可以 通过模仿…

4.制作的docker镜像

最近工作需要,制作docker镜像,用做构建使用。 1.拉取基础镜像ubuntu:22.04 docker pull ubuntu:22.042.运行ubuntu容器 docker run --privileged -d --name ubuntu_build ubuntu:22.04 sleep infinity3.进入运行的容器 docker exec -it ubuntu_build …

数据结构:队列详解 c++信息学奥赛基础知识讲解

目录 一、队列概念 二、队列容器 三、队列操作 四、代码实操 五、队列遍历 六、案例实操 题目描述: 输入格式: 输出格式: 输入样例: 输出样例: 详细代码: 一、队列概念 队列是一种特殊的线性…

激励视频广告的eCPM更高,每天的展示频次有限制吗?

在APP发展初期,由于DUA量级有限,所需的广告资源比较少,往往接入1-2家广告平台就能满足APP用户每日需要的广告展示量。而随着APP用户规模的扩大、广告场景的不断丰富,开发者要提升APP整体广告变现收益,一是可以尽可能多…

nacos使用shared-configs设置多个配置文件后,配置中修改无法动态更新 解决办法

问题描述 今天使用nacos去做配置分离,启动成功了,配置也读取了,但是当我修改nacos中的配置时,发现数据无法动态更新 下面是测试接口的调用 可以看到我修改配置后,接口返回的参数依然是老参数 问题排查 首先检查了…

重生奇迹MU新手攻略:如何一步步往大佬发展

装备强化攻略: 提纯装备:通过提纯装备可以提升基础属性,选择合适的装备进行提纯可以获得更好的效果。 镶嵌宝石:使用宝石进行装备镶嵌可以增加装备的属性,根据需要选择适合的宝石进行镶嵌。 洗练装备:通…

大模型赋能全链路可观测性:运维效能的革新之旅

目录 全链路可观测工程与大模型结合---提升运维效能 可观测性(Observability)在IT系统中的应用及其重要性 统一建设可观测数据 统一建设可观测数据的策略与流程 全链路的构成和监控形态 云上的全链路可视方案 为什么一定是Copilot 大模型的Copilo…

jenkins设置定时构建语法

一、设置定时 定时构建的语法是*** * * * ***。 第一个*表示分钟,取值范围是0~59。例如,5 * * * *表示每个小时的第5分钟会构建一次;H/15 * * * 或/15 * * * 表示每隔15分钟构建一次; 第2个表示小时,取值范围是0~23。…

气膜建筑审批流程及现状分析—轻空间

气膜建筑作为一种新兴的建筑形式,以其快速建造、成本低廉和灵活多变的优势在各个领域得到了广泛应用。然而,气膜建筑在我国尚未被纳入正式的建筑规范,这使得其审批流程与传统建筑有显著差异。轻空间将详细探讨气膜建筑的审批流程及其在实际操…

全局mixins

一、文章由来 在开发过程中发现在钩子函数位置直接使用dicts就能直接绑定数据了,由此溯源发现了自己的盲区 二、局部使用 // myMixin.js文件 var myMixin {created: function () {this.hello()},methods: {hello: function () {console.log(hello from mixin!)…

Transformers 安装与基本使用

文章目录 Github文档推荐文章简介安装官方示例中文情感分析模型分词器 Tokenizer填充 Padding截断 Truncation google-t5/t5-small使用脚本进行训练Pytorch 机器翻译数据集下载数据集格式转换 Github https://github.com/huggingface/transformers 文档 https://huggingface…

边缘计算VNC智能盒子如何助力HMI设备实现二次开发?

HMI(Human-Machine Interface)又称人机界面,是用户与机器之间交互和通信的媒介。今天带你了解智能盒子如何助力HMI设备实现二次开发? HMI设备被广泛应用在工业自动化中,具有显示设备信息,实时监测&#xf…

【Linux杂货铺】Linux学习之路:期末总结篇1

第一章 什么是Linux? Linux 是 UNIX 操作系统的一个克隆;它由林纳斯 本纳第克特 托瓦兹从零开始编写,并在网络上众多松散的黑客团队的帮助下得以发展和完善;它遵从可移植操作系统接口(POSIX)标准和单一 UNIX 规范…

短信群发策略优化:如何有效降低退订率?

在短信群发营销中,退订率的上升常常影响营销效果。为了降低退订率,提高客户黏性,以下是一些实用的策略建议: 1.合理控制发送频率 过多的短信发送会给客户带来骚扰感,导致退订。因此,应合理控制短信的发送频…

排序算法(C语言版)

前言 排序作为生产环境中常见的需求之一,对整个产品有举足轻重的影响,可以说使用一个合适的排序算法是业务逻辑中比较重要的一部分。今天我们就来介绍常见的排序算法以及实现 排序 所谓排序无非就是按照特定的规则对一组数据就行顺序化。 常见的排序有…

智能语音热水器:置入NRK3301离线语音识别ic 迈向智能家居新时代

一、热水器语音识别芯片开发背景 在科技的今天,人们对于生活品质的追求已不仅仅满足于基本的物质需求,更渴望通过智能技术让生活变得更加便捷、舒适。热水器作为家庭生活中不可或缺的一部分,其智能化转型势在必行。 在传统热水器使用中&#…

论文导读 | 事件因果关系抽取和识别

导读 目前,对事件因果关系的研究主要分为两类任务:事件因果关系识别(Event Causality Identification,ECI)和事件因果关系抽取(Event Causality Extraction)。事件因果关系识别旨在检测文本中两…