是否总是需要单独的“编写器”线程(在套接字读取器/文件编写器客户端中)?

时间:2012-06-01 18:50:23

标签: java multithreading writer

我有一些客户端代码从套接字读取(通过输入流)并在循环中写入文件(通过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字节/秒。 由于数据速率(无论结果是什么)是不变的,因此编写器是否会阻塞足够长的时间以致于读取器中的数据丢失?

总是有一个读者作家线程是不错的做法?

1 个答案:

答案 0 :(得分:0)

  

在什么时候(数据速率方面)我可能需要将文件写操作拆分成另一个线程(即“编写者”)

当您遇到性能问题或者分析器告诉您这是一个好主意时,您应该开始优化代码(使其更复杂)。

  

或者总是有一个读者和一个作家线程这是一个好习惯吗?

这是一种很好的做法,没有其他信息。但是在您的情况下,您知道数据要求,因此您应该只在期望大量吞吐量或者您希望在磁盘端受IO限制时才这样做。

  

我的要求消息率很低(即每秒最多约10个字节的1400字节消息)

这不是很多数据吞吐量来保证额外的代码复杂性

  

作者是否会长时间阻塞以致读者数据丢失?

在大多数情况下,本地磁盘IO将比网络更快。有可能遇到这种情况,但我认为这不常见。内核在套接字上给你很多缓冲,如果溢出内核缓冲区,TCP / IP协议将重新传输,这样即使你 阻塞了很长时间,你也不会丢失数据。