Sockets 并发写入套接字';s输出流
我想出了一个多线程TCP服务器来处理读写操作。我的主要目的是通过两条不同的线索来区分阅读和写作。因此,我有一个单独的线程池,用于写入套接字的outputstream。一旦某个线程完成读取并插入到队列(ArrayBlockingQueue)中,池中的另一个线程就会从队列中提取该数据并写入outputstream。 现在的问题是,我想知道多个线程何时尝试写入同一套接字的输出流; -这种行为会怎样 -这是内部管理还是需要专门处理 -字节是否混乱(混淆) 在这种情况下,有什么更好的方法 编辑: 我的问题与。这个链接是关于POSIX的,我忘了提到我的问题是关于JAVA套接字(socketWrite)的。为了回答EJP的评论,是的,我们的TCP协议的用例是由多个线程写入同一输出流(以提高性能)。目前为了解决我的问题,我已经同步了outputstreamSockets 并发写入套接字';s输出流,sockets,concurrency,outputstream,Sockets,Concurrency,Outputstream,我想出了一个多线程TCP服务器来处理读写操作。我的主要目的是通过两条不同的线索来区分阅读和写作。因此,我有一个单独的线程池,用于写入套接字的outputstream。一旦某个线程完成读取并插入到队列(ArrayBlockingQueue)中,池中的另一个线程就会从队列中提取该数据并写入outputstream。 现在的问题是,我想知道多个线程何时尝试写入同一套接字的输出流; -这种行为会怎样 -这是内部管理还是需要专门处理 -字节是否混乱(混淆) 在这种情况下,有什么更好的方法 编辑: 我的问题
synchronized (outputStream) {
outputStream.write(responseMessage);
outputStream.flush();
}
为什么要多个线程写入同一个套接字?这将如何出现在您的架构中?你想要的是一个读线程和一个写线程。我认为问题是让多个线程在同一个套接字上发送而不进行任何同步的可能的重复是一个坏主意,因为(正如你所怀疑的)这意味着远程客户端接收的数据将以不可预测的方式排序,因此难以/不可能可靠地解释。最好用一个线程来完成所有的写操作——其他线程可以将消息对象传递到此线程(例如,通过FIFO消息队列),然后它可以将消息的内容发送到套接字。谢谢Jeremy。但是,让多个线程在一个同步块中写入套接字有什么问题?为什么希望多个线程写入同一个套接字?这将如何出现在您的架构中?你想要的是一个读线程和一个写线程。我认为问题是让多个线程在同一个套接字上发送而不进行任何同步的可能的重复是一个坏主意,因为(正如你所怀疑的)这意味着远程客户端接收的数据将以不可预测的方式排序,因此难以/不可能可靠地解释。最好用一个线程来完成所有的写操作——其他线程可以将消息对象传递到此线程(例如,通过FIFO消息队列),然后它可以将消息的内容发送到套接字。谢谢Jeremy。但是让多个线程在同步块中写入套接字有什么问题呢?