Ich habe eine ObjectInputSteam
y ObjectOutputStream
bei einer Sperrung SocketChannel
und ich versuche, gleichzeitig zu lesen und zu schreiben. Mein Code ist in etwa so:
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
Das Problem ist, dass das Schreiben in Zeile (B) blockiert wird, bis das Lesen in Zeile (A) abgeschlossen ist (blockiert das Objekt, das von SelectableChannel#blockingLock()
). Aber die Anwendungslogik schreibt vor, dass das Lesen nicht abgeschlossen wird, bevor alle Schreibvorgänge abgeschlossen sind, so dass wir eine effektive Blockade haben.
SocketChannel
Die Javadocs besagen, dass gleichzeitiges Lesen und Schreiben unterstützt wird.
Ich hatte kein solches Problem, als ich eine normale Socket-Lösung ausprobierte:
Socket socket = new Socket();
socket.connect(destNode);
final OutputStream outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectInputStream = new ObjectInputStream(socket.getInputStream());
Allerdings kann ich dann nicht die Leistungsvorteile nutzen, die die FileChannel#transferTo(...)