Pipe
概述
Java NIO Pipe是2个线程之间的单向数据连接。在多线程编程中除了wait(), notify(), notifyAll()等,增加了一种新的线程间通讯方式。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。如下图示例,数据通过Thread A 写入 sink通道,然后通过Thread B 读取source通道获得数据。
类结构
打开通道
Pipe pipe = Pipe.open();
写入数据
重载方法有三个,与其他普通的Channel操作相同。分别是写入单个ByteBuffer,写入多个ByteBuffer,和指定长度写入多个ByteBuffer。
pipe.sink().write();
读取数据
重载方法有三个,与其他普通的Channel操作相同。分别是读入单个ByteBuffer,读入多个ByteBuffer,和指定长度读入多个ByteBuffer。
pipe.source().read();
Demo
package com.freud.nio;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;
import java.util.Scanner;
/**
* * @author Freud
*/
public class PipTest implements Runnable {
private Pipe pipe;
public PipTest(Pipe pipe) {
this.pipe = pipe;
}
public void run() {
try {
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (pipe.source().read(buffer) >= 0) {
buffer.flip();
byte[] bytes = new byte[buffer.limit()];
for (int i = 0; buffer.hasRemaining(); i++) {
bytes[i] = buffer.get();
}
buffer.clear();
System.out.println("Input : " + new String(bytes));
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
Pipe pipe = Pipe.open();
new Thread(new PipTest(pipe)).start();
Scanner scanner = new Scanner(System.in);
try {
while (true) {
String input = scanner.next();
pipe.sink().write(ByteBuffer.wrap(input.getBytes()));
}
} finally {
scanner.close();
}
}
}
参考资料
JAVA-NIO(英文版) - Ron Hitchens
JAVA-NIO(中文版) - Ron Hitchens(著) 裴小星(译)
Java nio tutorial : http://tutorials.jenkov.com/java-nio/index.html
并发编程网:Java NIO系列教程-中文翻译版 : http://ifeve.com/overview/