gpt4 book ai didi

Java:是否可以通过 Object(In|Out)putStreams 在阻塞的 SocketChannel 上进行并发读写?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:57 25 4
gpt4 key购买 nike

我在阻塞的 SocketChannel 上创建了一个 ObjectInputSteamObjectOutputStream 并尝试同时读取和写入。我的代码是这样的:

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

问题是第 (B) 行的写入阻塞,直到第 (A) 行的读取完成(阻塞 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(...)

的性能优势

最佳答案

这似乎是 java.nio.channels.Channels 中的错误(感谢 Tom Hawtin;下次将其作为答案发布)。描述了一个很好的描述和解决方法 here (实际上是 Tom 列出的错误的副本):

我测试了解决方法并且它有效。

关于Java:是否可以通过 Object(In|Out)putStreams 在阻塞的 SocketChannel 上进行并发读写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/174774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com