Java NIO Pipe的使用
?
? ??Java NIO Pipe是两个线程间的单道数据连接。一个Pipe有一个SourceChannel和一个SinkChannel。你可以将数据写入SinkChannel,这个数据可以从SourceChannel中读取。
? ? 下面是Pipe的一个内部结构图示:

? ?
? ? 根据Javadoc的解释,不管一个线程是否向Pipe写入数据,它都会被阻塞,直到另外一个线程读取了该数据。另外SinkChannel只能写(write),SourceChannel只能读(read)
?
下面编写了一个读线程和写线程,它们共享一个Pipe。写线程往SinkChannel写入数据,读线程从SourceChannel读取数据。
package org.snake.pipe;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.Pipe;import java.nio.channels.Pipe.SinkChannel;import java.nio.channels.Pipe.SourceChannel;import java.util.concurrent.TimeUnit;/** * 读线程 */class Reader implements Runnable {private SourceChannel inChannel;ByteBuffer buf;public Reader(SourceChannel inChannel) {this.inChannel = inChannel;buf = ByteBuffer.allocate(48);}@Overridepublic void run() {while (true) {buf.clear();try {int readBytes = inChannel.read(buf);while (readBytes != -1) {buf.flip(); // 切换到读模式System.out.print("Reader:开始读数据");while (buf.hasRemaining()) {System.out.print((char) buf.get()); // 一次读一个字节}buf.clear();readBytes = inChannel.read(buf);}System.out.println();} catch (IOException e) {e.printStackTrace();}}}}/** * 写线程 */class Writer implements Runnable {private SinkChannel outChannel;private ByteBuffer buf;private int increment = 1;public Writer(SinkChannel outChannel) {this.outChannel = outChannel;buf = ByteBuffer.allocate(48);}@Overridepublic void run() {while (true) {try {TimeUnit.SECONDS.sleep(5); // 休眠5秒钟} catch (InterruptedException e1) {e1.printStackTrace();}buf.clear();String msg = "msg:" + increment++;buf.put(msg.getBytes());buf.flip();System.out.printf("%nWriter:开始写数据%s%n", msg);while (buf.hasRemaining()) {try {outChannel.write(buf);} catch (IOException e) {e.printStackTrace();}}}}}public class Main {public static void main(String[] args) throws IOException {Pipe pipe = Pipe.open();SourceChannel inChannel = pipe.source();SinkChannel outChannel = pipe.sink();Reader reader = new Reader(inChannel); // 读线程Writer writer = new Writer(outChannel); // 写线程new Thread(reader).start();new Thread(writer).start();}}?下面是其中一部分输出:
Writer:开始写数据msg:1Reader:开始读数据msg:1Writer:开始写数据msg:2Reader:开始读数据msg:2Writer:开始写数据msg:3Reader:开始读数据msg:3Writer:开始写数据msg:4Reader:开始读数据msg:4...
?
1 楼 lazynote 19 小时前 想问下楼主,NIO PIPE在LINUX下的counterpart是什么? 2 楼 zjuttsw 18 小时前 lazynote 写道想问下楼主,NIO PIPE在LINUX下的counterpart是什么?