2012-06-01 23 views
2

我有一些客户端代码,其从插座中读取(经由一个输入流),并在一个循环中写入到文件中(经由的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(); 
} 

(简化的代码来显示一般流程 - 我当我需要添加一个额外的写入器线程时,m只对学习感兴趣)

在什么时候(数据速率)我可能需要将文件写入操作拆分到另一个线程(即“writer”)在读写器线程之间有一个像ConcurrentLinkedQueue

我的需求消息率低(即1400倍字节的MSG在最高〜10每秒)我跑的基准通量

测试代码表明它可以很容易地处理150000字节/秒。由于数据速率(不管它原来是什么)是恒定的,作者是否可以阻止足够长的时间,导致读者数据丢失?

还是只是良好的做法总是有一个读者作家线程?

回答

0

在什么时候(数据速率明智),我可能需要将文件写入操作拆分到另一个线程(即,“作家”)

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

或者它是否只是一个良好的做法,总是有一个读者和一个作家线程?

这是没有其他信息的良好做法。但在你的情况下,你知道数据需求,所以如果你期望有大量的吞吐量或者你希望在磁盘端进行IO绑定,那么你只应该这样做。

我的请求消息率低(即1400字节封邮件在最大〜10每秒)

这仅仅是不是有很多的数据吞吐量,以保证额外的代码复杂

作者是否可以阻止足够长的时间,导致读者数据丢失?

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

+0

感谢闪电般的快速反应!你已经证实了我的怀疑。 (有点偏执狂从不伤害...) –

相关问题