通过管道进行线程间通信:字节流。字符流的用法及API类似
2015-11-19 22:12
393 查看
管道流(PipedStream)可以用于不同线程间直接传送数据。
一个线程发送数据到输出管道,另一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。
输出:
一个线程发送数据到输出管道,另一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。
package thread.communicate; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; /*2015-11-19*/ public class CommunicateWithPipedStream { public static void main(String[] args) { try { PipedOutputStream out = new PipedOutputStream(); DataWriter writer = new DataWriter(out); PipedInputStream in = new PipedInputStream(); DataReader reader = new DataReader(in); // out.connect(in); in.connect(out); new Thread(writer, "Writer").start(); new Thread(reader, "Reader").start(); } catch (Exception e) { e.printStackTrace(); } } } class DataWriter implements Runnable { private PipedOutputStream _out; public DataWriter(PipedOutputStream out) { super(); this._out = out; } @Override public void run() { write(); } public void write() { System.out.println(Thread.currentThread() + "Start write...."); try { for (int i = 0; i < 20; i++) { String outStr = "" + (i + 1); System.out.println(Thread.currentThread() + outStr); _out.write(outStr.getBytes()); } _out.close(); } catch (IOException e) { e.printStackTrace(); } } } class DataReader implements Runnable { private PipedInputStream _in; public DataReader(PipedInputStream in) { _in = in; } @Override public void run() { read(); } public void read() { try { System.out.println(Thread.currentThread() + "Start read...."); byte[] byteArray = new byte[20]; int readLength = _in.read(byteArray); while (readLength != -1) { String newData = new String(byteArray, 0, readLength); System.out.println(Thread.currentThread() + newData); readLength = _in.read(byteArray); } System.out.println(); _in.close(); } catch (Exception e) { e.printStackTrace(); } } }
输出:
Thread[Writer,5,main]Start write.... Thread[Writer,5,main]1 Thread[Reader,5,main]Start read.... Thread[Writer,5,main]2 Thread[Reader,5,main]1 Thread[Reader,5,main]2 Thread[Writer,5,main]3 Thread[Writer,5,main]4 Thread[Writer,5,main]5 Thread[Writer,5,main]6 Thread[Writer,5,main]7 Thread[Writer,5,main]8 Thread[Writer,5,main]9 Thread[Writer,5,main]10 Thread[Writer,5,main]11 Thread[Writer,5,main]12 Thread[Writer,5,main]13 Thread[Writer,5,main]14 Thread[Writer,5,main]15 Thread[Writer,5,main]16 Thread[Writer,5,main]17 Thread[Writer,5,main]18 Thread[Writer,5,main]19 Thread[Writer,5,main]20 Thread[Reader,5,main]34567891011121314151 Thread[Reader,5,main]617181920
相关文章推荐
- 【iOS学习笔记】iOS算法(五)之折半查找
- 【iOS学习笔记】iOS算法(四)之冒泡排序
- IIS7.0上传文件限制的解决方法
- Linux目录规范和含义(转)
- 12.值动画、测量规则
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 图像的空间转换 HSI→RGB 和 RGB→HSI
- Activity生命周期详解
- OpenGL ES 模型视图操作入门
- UltraEdit 激活 破解 教程
- SRM 670 div2 B BearSlowlySorts
- 史话未完待续。。。
- 【iOS学习笔记】iOS算法(三)之插入排序
- Java 调用 C++ (Java 调用 dll)康哥手把手教你
- python+pyqt5
- Hibernate Tools安装与使用
- Lowest Common Ancestor in a Binary Tree
- .NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库
- 【iOS学习笔记】iOS算法(二)之选择排序
- 索引的优点