我有一些客户端代码从套接字读取(通过输入流)并在循环中写入文件(通过BufferedWriter):
dataInStream = new BufferedInputStream(dataSocket.getInputStream());
outputFile = new BufferedWriter(new FileWriter(filename));
byte bytes[] = new byte[64];
Message msg = new Message();
int bytesRead = 0;
while (true) {
bytesRead = dataInStream.read(bytes, 0, 64);
// create a message from the raw data...
msg.parse(bytes);
// write it to the file as a String
outputFile.write(msg.toString());
outputFile.flush();
}
(显示一般流程的简化代码 - 我只对在需要添加额外编写器线程时学习感兴趣)
在什么时候(数据速率方面)我可能需要将文件写入操作拆分成另一个线程(即“编写器”),其中包含读写器之间的 ConcurrentLinkedQueue 线程?
我的要求消息率很低(即每秒最多约10个字节的1400字节消息)
测试代码我跑到基准测试吞吐量显示它可以轻松处理150000字节/秒。 由于数据速率(无论结果是什么)是不变的,因此编写器是否会阻塞足够长的时间以致于读取器中的数据丢失?
或总是有一个读者和作家线程是不错的做法?
答案 0 :(得分:0)
在什么时候(数据速率方面)我可能需要将文件写操作拆分成另一个线程(即“编写者”)
当您遇到性能问题或者分析器告诉您这是一个好主意时,您应该仅开始优化代码(使其更复杂)。
或者总是有一个读者和一个作家线程这是一个好习惯吗?
这是一种很好的做法,没有其他信息。但是在您的情况下,您知道数据要求,因此您应该只在期望大量吞吐量或者您希望在磁盘端受IO限制时才这样做。
我的要求消息率很低(即每秒最多约10个字节的1400字节消息)
这不是很多数据吞吐量来保证额外的代码复杂性
作者是否会长时间阻塞以致读者数据丢失?
在大多数情况下,本地磁盘IO将比网络更快。有可能遇到这种情况,但我认为这不常见。内核在套接字上给你很多缓冲,如果溢出内核缓冲区,TCP / IP协议将重新传输,这样即使你 阻塞了很长时间,你也不会丢失数据。