ブロッキングでObjectInputSteam
andを作成し、同時に読み書きしようとしています。私のコードは次のようなものです:ObjectOutputStream
SocketChannel
socketChannel = SocketChannel.open(destNode);
objectOutputStream = new ObjectOutputStream(Channels.newOutputStream(socketChannel));
objectInputStream = new ObjectInputStream(Channels.newInputStream(socketChannel));
Thread replyThread = new Thread("SendRunnable-ReplyThread") {
@Override
public void run() {
try {
byte reply = objectInputStream.readByte();//(A)
//..process reply
} catch (Throwable e) {
logger.warn("Problem reading receive reply.", e);
}
}
};
replyThread.start();
objectOutputStream.writeObject(someObject);//(B)
//..more writing
問題は、行 (A) での読み取りが完了するまで、行 (B) での書き込みがブロックされることです (によって返されるオブジェクトのブロックSelectableChannel#blockingLock()
)。しかし、アプリのロジックは、すべての書き込みが完了するまで読み取りが完了しないように指示するため、実質的なデッドロックが発生します。
SocketChannel
javadocs によると、同時読み取りと書き込みがサポートされています。
通常の Socket ソリューションを試したとき、そのような問題は発生しませんでした。
Socket socket = new Socket();
socket.connect(destNode);
final OutputStream outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectInputStream = new ObjectInputStream(socket.getInputStream());
ただし、パフォーマンス上の利点を利用することはできませんFileChannel#transferTo(...)