1. 概述

Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。下面是Pipe原理的图示:

当有两个线程ThreadA和ThreadB需要进行线程间通信时,ThreadA可以通过SinkChannel向Pipe中写入数据。ThreadB可以通过SourceChannel从Pipe中读取数据。

2. 创建管道

通过Pipe.open()方法打开管道。例如:

Pipe pipe = Pipe.open();

3. 向管道写数据

要向管道写数据,需要访问sink通道。像这样:

Pipe.SinkChannel sinkChannel = pipe.sink();

通过调用SinkChannel的write()方法,将数据写入SinkChannel,像这样:

String newData = "New String to write to file..." + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());buf.flip();while(buf.hasRemaining()) {sinkChannel.write(buf);
}

4. 从管道读取数据

从读取管道的数据,需要访问source通道,像这样:

Pipe.SourceChannel sourceChannel = pipe.source();

调用source通道的read()方法来读取数据,像这样:

ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = sourceChannel.read(buf);

read()方法返回的int值会告诉我们多少字节被读进了缓冲区。

NIO详解(十一):线程间通信管道Pipe相关推荐

  1. java线程间通信管道_通过管道进行线程间通信

    管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另一个线程从输入管道中读数据.通过管道,实现不同线程间的通信,而无须借助类似共享变量.临时文件之 ...

  2. 交换机的转发原理 |VLAN详解·图解 |VLAN间通信 |华为,思科配置

    目录 交换机的转发原理 一.HUB 二.交换机 1.MAC地址表: 2.转发数据: 3.三层交换机 VLAN 1.VLAN(Virtual Local Area Network,虚拟局域网) 2.任何 ...

  3. 通过管道进行线程间通信

    在Java语言中提供了各种各样的输入/输出流Stream,使我们能够方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个发送数据到输出管道,另一个 ...

  4. Java高并发编程详解系列-线程通信

      进程间的通信,又被称为是进程内部的通信,我们都知道每个进程中有多个线程在执行,多个线程要互斥的访问共享资源的时候会发送对应的等待信号或者是唤醒线程执行等信号.那么这些信号背后还有什么样的技术支持呢 ...

  5. 十一、线程与线程间通信

    目录 线程 一.线程中的基本概念 二.线程的创建和使用 方式一:Thread类 方式二:实现Runnable接口 三.线程状态 常见方法 join方法 sleep方法 Interrupt 方法 yie ...

  6. 进程间通信线程间通信

    一.多进程: 首先,先来讲一下fork之后,发生了什么事情. 由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回两次.两次返回的区别是子进程的返回值是0,而父进 ...

  7. android线程间通信的几种方法_Android 技能图谱学习路线

    Java基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap 和 HashTable 区别 HashCode 作用,如何重载hashC ...

  8. linux线程间通信优点,进程间通信与线程间通信【转】

    一个进程写管道:写入字节数小于PIPE_BUF是原子操作,写操作在管道缓冲区没有及时读走时发生阻塞. 一个进程读管道:读操作在管道缓冲区没有数据时发生阻塞. 以前一直想找个机会总结一下进程和线程的通信 ...

  9. Java多线程:线程间通信之volatile与sychronized

    由前文Java内存模型我们熟悉了Java的内存工作模式和线程间的交互规范,本篇从应用层面讲解Java线程间通信. Java为线程间通信提供了三个相关的关键字volatile, synchronized ...

最新文章

  1. 什么是机器人底盘 答案在这里!
  2. delete指针之后应该赋值NULL
  3. UIRemoteNotificationType 参考
  4. linux yun 安装 redis,Linux系统安装NoSQL(MongoDB和Redis)步骤及问题解决办法(总结篇)...
  5. Socket编程之简单介绍
  6. 信息系统项目管理师学习方法
  7. php jq异步上传图片,Jquery实现异步上传图片
  8. 2019年这50个Kafka面试题,你知道答案么
  9. php充值卡,ecshop 充值卡功能_懒人程序
  10. selenium脚本录制
  11. 今天看到一篇小册子上的话
  12. MySQL高级-SQL优化步骤
  13. AI 快车道目标检测专场, PaddlePaddle “深度干货”
  14. pycharm添加python注释头_Pycharm自动添加头注释
  15. 【一键激活win8.1系统】
  16. Python 简易图形用户界面计算器
  17. phalapi做登录检测_欢迎使用PhalApi!
  18. manjaro linux树莓派,manjaro
  19. oracle错误信息提示中英文显示切换
  20. C语言 | 求奇偶数个数

热门文章

  1. ssh密钥分发之二:使用sshpass配合ssh-kopy-id编写脚本批量分发密钥:
  2. jQuery 事件绑定
  3. weblogic集群的资料
  4. 为什么Control类提供了Invoke和BeginInvoke机制
  5. HttpRequest获取文件流,HttpResponse输出文件流
  6. PHP - NetBeans中调试PHP
  7. 零基础如何入门深度学习?
  8. Python软件源PyPI中国镜像 解决PIP下载安装速度慢
  9. 机器学习入门方法推荐(少走弯路)入门视频推荐
  10. ajax请求get方法的封装,使用jQuery中Ajax的封装函数——$.get()