前言

在并发编程中,需要处理两个问题:线程之间如何通信及线程之间如何同步。通知是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递

在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。而子啊消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。

Java 的并发才作用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。

而Java中还有另一种用的比较少的线程间的通信方式:管道流。

如何使用?

管道输入/输入流和普通的文件输入/输出流或者网络输入/输出流不同之处在于,它主要用于线程之间的数据传输,而传输的媒介为内存。

管道输入/输入流主要包括了如下4种具体实现:PipedOutputStream,PipedInputStream,PipedReader 和 PipedWriter,前两种面向字节,而后两种面向字符。

我们先来一个例子看看:

public class PipedStreamDemo {public static void main(String[] args) throws IOException {PipedWriter writer = new PipedWriter();PipedReader reader = new PipedReader();PipedInputStream inputStream = new PipedInputStream();PipedOutputStream outputStream = new PipedOutputStream();// 将输出流和输入流连接writer.connect(reader);Thread printThread = new Thread(new Print(reader));printThread.start();int receive;try {while ((receive = System.in.read()) != -1) {// 从main线程写到 print 线程writer.write(receive);}} finally {writer.close();}}static class Print implements Runnable {private PipedReader in;public Print(PipedReader in) {this.in = in;}@Overridepublic void run() {int receive;try {while ((receive = in.read()) != -1) {// 读取 main 线程发送过来的数据并打印System.out.print((char) receive);}} catch (Exception e) {e.printStackTrace();}}}}

上面的代码种,创建了 printThread,它用来接受 main 线程的输入,任何 main 线程的输入均通过 PipedWriter 写入,而 printThread 在另一端通过 PipedReader 将内容读出并打印。

对于 Piped 类型的流,必须先要进行绑定,也就是调用 connect 方法,如果没有将输入 / 输出流绑定起来,对于该流的访问将会抛出异常。

而作为这两个类连接的重要方法 connect 方法式如何实现的呢?

    public synchronized void connect(PipedReader snk) throws IOException {if (snk == null) {throw new NullPointerException();} else if (sink != null || snk.connected) {throw new IOException("Already connected");} else if (snk.closedByReader || closed) {throw new IOException("Pipe closed");}sink = snk;snk.in = -1;snk.out = 0;snk.connected = true;}

首先参数判断,然后将输入流设置为输出流的 sink 属性。这样就将两个流关联了起来。实现了两个线程的通信。

总结

总的来说,该类的应用场景并不是很多,只是我们应该知道另一种线程通信的方式。嗯,就酱。

good luck !!!!

转载于:https://www.cnblogs.com/stateis0/p/9062024.html

并发编程线程通信之管道流相关推荐

  1. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  2. 高并发编程-线程通信_使用wait和notify进行线程间的通信

    文章目录 概述 场景 引子 synchronized wait/notify机制 synchronized wait/notify 改造 问题 概述 Java中线程通信协作的最常见的两种方式: syn ...

  3. 判断线程是否执行完毕_Java并发编程 | 线程核心机制,基础概念扩展

    源码地址:GitHub || GitEE 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效率.下面提供一个 ...

  4. python 线程同步_Python并发编程-线程同步(线程安全)

    Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...

  5. 并发编程——线程协作

    并发编程--线程协作 ​ 前面学习了线程,那么并发编程中,如何协调多个线程来开发呢? Semaphore ​ 信号量跟前面将的同步互斥解决方案--信号量是一个东西,这是JDK的信号量实现. 源码分析 ...

  6. Java 并发编程 -- 线程池源码实战

    一.概述 小编在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写的太简单,只写了一点皮毛,要么就是是晦涩难懂,看完之后几乎都 ...

  7. Java并发编程—线程间协作方式wait()、notify()、notifyAll()和Condition

    原文作者:Matrix海 子 原文地址:Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 目录 一.wait().notify()和notifyA ...

  8. python协程和线程_python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是 ...

  9. python apply_async死锁_python之并发编程(线程\进程\协程)

    一.进程和线程 1.进程假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是不 ...

最新文章

  1. shell清除日志小脚本
  2. a, b = b, a+b
  3. php正则表达式实例详解,正则表达式实例解析
  4. threadlocals_如何使用ThreadLocals射击自己
  5. C#给字符串赋予字面值——字符串插入、转义序列的使用
  6. 前端学习(1932)vue之电商管理系统电商系统之tree树形控件
  7. 【牛客 - 318M】被打脸的潇洒哥(几何问题,水题,结论,知识点)
  8. ElasticSearch docker安装
  9. iptables命令详解
  10. 软件工程类图_软件工程系列-UML3
  11. 山东省计算机软件比赛,第十七届山东省大学生软件设计大赛“互联网+”组决赛成功举行...
  12. Android平台上使用气压传感器计算海拔高度
  13. Java------IO流之文件专属流
  14. 我在创业游戏公司的一年
  15. 编辑距离(Edit Distance) 一文读懂(Python实现)
  16. 小米摄像机升级失败,小米摄像机黄灯常亮修复,全网最硬核修复
  17. java web+前端实现 人脸登录功能(专注细节)
  18. QT Quick项目简介
  19. 给初学Linux的朋友分享一些心得总结
  20. 帆软数据决策平台连接SAP RFC实例

热门文章

  1. Java多线程模式-Balking模式
  2. matlab蚁群算法 路径规划,基于蚁群算法的机器人路径规划MATLAB源码
  3. 给研究思路就能推荐数据集,还能分析语料“毒性”,CMU博士后等人推出NLP数据处理神器...
  4. 听说有人解决了三体问题,我去做了一点微小的调查
  5. 中国AI服务器,刷新全球18项性能基准测试纪录
  6. CNCC技术论坛:后量子霸权阶段的量子计算
  7. 他是清华姚班高材生,选择从谷歌辞职回山西教书,张昆玮说「不想像成功学那样生活」...
  8. ICLR论文盲审大反转:三个“8”完美过关,又来两个“1”彻底拒绝
  9. docker中使用systemctl启动服务
  10. js /jquery停止事件冒泡和阻止浏览器默认事件