Java: Czy współbieżne odczyty i zapisy są możliwe w blokującym SocketChannel za pomocą putStreams Object (In | Out)?
StworzyłemObjectInputSteam
iObjectOutputStream
na blokowaniuSocketChannel
i próbuję jednocześnie czytać i pisać. Mój kod wygląda mniej więcej tak:
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
Problem polega na blokowaniu zapisu w wierszu (B), dopóki odczyt w wierszu (A) nie zostanie zakończony (bloki na obiekcie zwróconym przezSelectableChannel#blockingLock()
). Ale logika aplikacji nakazuje, aby odczyt nie zakończył się, dopóki wszystkie zapisy nie zostaną zakończone, więc mamy skuteczny impas.
SocketChannel
javadocs twierdzą, że współbieżne odczyty i zapisy są obsługiwane.
Nie doświadczyłem takiego problemu, gdy próbowałem zwykłego rozwiązania Socket:
Socket socket = new Socket();
socket.connect(destNode);
final OutputStream outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectInputStream = new ObjectInputStream(socket.getInputStream());
Jednak nie mogę skorzystać z zalet wydajnościFileChannel#transferTo(...)