PipedOutputStream和PipedInputStream管道实现线程通信

来源:互联网 发布:华为盒子看电影软件 编辑:程序博客网 时间:2024/06/10 02:24

PipedOutputStream和PipedInputStream通过字节流实现线程间的通信,

通过PipedOutputStream.connect(PipedInputStream snk)

或 PipedInputStream.connect(PipedOutputStream src)建立连接。

实例:

1. 使用PipedOutputStream输出流写入数据

package com.lanhuigu.JavaBase.thread.waitnotify6;import java.io.IOException;import java.io.PipedOutputStream;/** * 通过输出流--写入数据 */public class WriteData {public void writeMethod(PipedOutputStream out) {try {for (int i = 0; i < 500; i++) {String outData = "" + (i+1);out.write(outData.getBytes());System.out.println("写入数据:" + outData);}// 关闭输出流out.close();} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}}

2. 使用PipedInputStream输入流读出数据

package com.lanhuigu.JavaBase.thread.waitnotify6;import java.io.IOException;import java.io.PipedInputStream;/** * 通过输入流--读出数据 */public class ReadData {public void readMethod(PipedInputStream input) {try {byte[] byteArray = new byte[20];int readLength = input.read(byteArray);while (readLength != -1) {String newData = new String(byteArray, 0, readLength);System.out.println("读出数据:" + newData);readLength = input.read(byteArray);}// 关闭流input.close();} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}}}

3. 写入数据线程

package com.lanhuigu.JavaBase.thread.waitnotify6;import java.io.PipedOutputStream;/** * 根据输出流--写入数据--线程 */public class WriteThread extends Thread{private WriteData writeData;private PipedOutputStream out;public WriteThread(WriteData writeData, PipedOutputStream out) {// TODO Auto-generated constructor stubsuper();this.writeData = writeData;this.out = out;}@Overridepublic void run() {// TODO Auto-generated method stubwriteData.writeMethod(out);}}

4. 读出数据线程

package com.lanhuigu.JavaBase.thread.waitnotify6;import java.io.PipedInputStream;/** * 根据输入流--读出数据--线程 */public class ReadThread extends Thread{private ReadData readData;private PipedInputStream input;public ReadThread(ReadData readData, PipedInputStream input) {// TODO Auto-generated constructor stubsuper();this.readData = readData;this.input = input;}@Overridepublic void run() {// TODO Auto-generated method stubreadData.readMethod(input);}}

5. 测试类

package com.lanhuigu.JavaBase.thread.waitnotify6;import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;/** * 测试类 */public class RunTest {public static void main(String[] args) {try {WriteData writeData = new WriteData();ReadData readData = new ReadData();PipedInputStream inputStream = new PipedInputStream();PipedOutputStream outputStream = new PipedOutputStream();/* * 通过 inputStream.connect(outputStream) * 或 * outputStream.connect(inputStream) * 使得两个Stream之间产生通信链接,进行数据交换输出与输入。 *///inputStream.connect(outputStream);outputStream.connect(inputStream);ReadThread readThread = new ReadThread(readData, inputStream);readThread.start();Thread.sleep(3000);// 休眠3秒WriteThread writeThread = new WriteThread(writeData, outputStream);writeThread.start();} catch (IOException e) {// 流异常// TODO: handle exceptione.printStackTrace();} catch (InterruptedException e) {// 线程中断异常// TODO Auto-generated catch blocke.printStackTrace();}}}

代码分析:

(1) 代码中通过 inputStream.connect(outputStream)或outputStream.connect(inputStream)

使得两个Stream之间产生通信链接,进行数据交换输出与输入,从而实现线程通信。

(2) 当线程ReadThread启动时,int readLength = input.read(byteArray)未读取到数据,

只有当线程WrithThread启动后,开始写入数据,ReadThread才能够读取到数据。


阅读全文
0 0
原创粉丝点击