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(...)

questionAnswers(4)

yourAnswerToTheQuestion