多个线程和多个BufferedReaders

时间:2015-07-30 15:20:40

标签: java multithreading java-io


我有一个创建4个线程的程序。
在每个线程中我创建一个tcp连接。
每个连接都有它的BufferedOutputStream和BufferedReader。
每个TCP连接都被处理通过分离的线程
每个线程的目的是处理我传入的数组。
问题是,根据线程数量,运行每个线程所花费的时间不会变化创造。
经过长时间的嗅探,我发现问题在于从InputStream读取,正好在行
while((line=reader.readLine())!=null){do stuff}
当我发表评论时这行代码,程序运行得更快,应该如此。我同意线程在从流中读取时被阻塞,并且让我们说1秒,但如果我增加线程数,则必须更快地完成工作。
但在我的情况下,在1个或4个线程中,我处理相同的数据,相同的时间。
我做错了什么?请帮帮我。

3 个答案:

答案 0 :(得分:2)

您很可能正在使用阻止IO但不希望它阻止。

我建议您使用;

  • 非阻塞IO(不容易),
  • 使用线程进行阅读,或
  • 重新考虑您的设计,期望readLine()应该阻止。

答案 1 :(得分:1)

FileInputStream does an I/O operation on every read and it synchronizes on all method calls to make it thread-safe. To reduce this overhead, read multiple bytes at once into a buffer array of bytes

    FileInputStream f = new FileInputStream( name );
    enterbyte[] barray = new byte[SIZE];
    long checkSum = 0L;
    int nRead;
    while ( (nRead=f.read( barray, 0, SIZE )) != -1 )
    for ( int i=0; i<nRead; i++ )
        checkSum += barray[i];

答案 2 :(得分:1)

听起来你的应用程序是网络限制的。基本上,网络(或连接另一端的服务器或客户端)无法提供足够的数据数据来保持线程忙碌。

您不太可能在此应用程序中执行任何操作以显着提高吞吐量。通过使另一端更快......或者获得更快的端到端网络连接,您可能会获得一些牵引力。

  

所以看起来,我有多个线程,但是所有这些线程都从单个BufferedReader读取,或类似的东西。

这与你之前所说的相矛盾。如果你有4个线程正在读写4个独立的套接字,那么它们就不会共享一个BufferedReader。在等待阅读不同阅读器时,被阻止的线程可能会被阻塞。