您的位置:首页 > 编程语言 > Java开发

JAVA多线程-线程间通信(三)-通过管道进行线程间通信

2016-02-20 18:02 891 查看
通过管道进行线程间通信

    管道流(pipeStream):用于在不同线程间直接传送数据。

    Java的JDK中提供了四个类来使线程间通信,我们这里也可以复习一下java中流的使用。


      1)PipedInputStream 和 PipedOutputStream

      2)PipedWriter 和PipedReader

     项目案例:我们采用字节流去实现两个线程间的数据传输。(字符流的原理类似)
package org.jksoft.thread.pipe;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
* 测试一:利用管道字节流,进行线程间通信
*
* @author mcl
*
* 2016-2-20-下午4:03:48
*/
public class Test1 {
// 准备一个发送流的类
class WriterUtil {
public void write(PipedOutputStream out) {
System.out.println("开始写。。。");
for (int i = 0; i < 300; i++) {
try {
out.write(("" + (i + 1)).getBytes());
System.out.print("" + (i + 1));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
System.out.println();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

// 准备一个接收流的类
class ReaderUtil {

public void read(PipedInputStream in) {
System.out.println("开始读。。。");
byte[] buf = new byte[20];
try {
int length = in.read(buf);
while (length != -1) {
System.out.print(new String(buf, 0, length));
length = in.read(buf);
}
System.out.println();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
}

// 准备一个发送流的线程
class WThread extends Thread {
private WriterUtil writerUtil;
private PipedOutputStream out;

public WThread(WriterUtil writerUtil, PipedOutputStream out) {
this.writerUtil = writerUtil;
this.out = out;
}

public void run() {
writerUtil.write(out);
}
}

// 准备一个接收流的线程
class RThread extends Thread {
private ReaderUtil readerUtil;
private PipedInputStream in;

public RThread(ReaderUtil readerUtil, PipedInputStream in) {
this.readerUtil = readerUtil;
this.in = in;
}

public void run() {
readerUtil.read(in);
}
}

// 主方法
public static void main(String[] args) throws InterruptedException {
Test1 test1 = new Test1() ;
ReaderUtil readerUtil = test1.new ReaderUtil();
PipedInputStream in = new PipedInputStream();
WriterUtil writerUtil = test1.new WriterUtil();
PipedOutputStream out = new PipedOutputStream();
try {
out.connect(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
RThread r =test1.new RThread(readerUtil, in);
WThread w =test1.new WThread(writerUtil, out);
r.start();
Thread.sleep(2000);
w.start();
}
}
  运行结果:
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: