【问题标题】:Multiple threads and multiple BufferedReaders多个线程和多个 BufferedReader
【发布时间】:2015-10-22 01:08:06
【问题描述】:


我有一个创建 4 个线程的程序。
在每个线程中我创建一个 tcp 连接。
每个连接都有其 BufferedOutputStream 和 BufferedReader。
每个 TCP 连接由单独的线程处理 每个线程的目的是处理我传入的数组。
问题是,运行每个线程所花费的时间不会因我创建的线程数量而异。
经过长时间的嗅探,我发现问题出在从 InputStream 读取,正好在一行
while((line=reader.readLine())!=null){do stuff}
当我评论这行代码时,程序运行得更快,应该是。
我同意线程在从流中读取时被阻塞,假设需要 1 秒,但如果我增加线程数,工作必须更快完成。
但就我而言,在 1 个或 4 个线程中,我处理相同的数据,相同的时间。
我做错了什么?请帮帮我。

【问题讨论】:

  • 如果每个 TCP 连接都有自己的阅读器,你为什么怀疑所有线程都在使用同一个阅读器?

标签: java multithreading java-io


【解决方案1】:

您很可能正在使用阻塞 IO,但不要指望它会阻塞。

我建议你要么使用;

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

【讨论】:

  • Erm ... 如果线程大部分时间都被阻塞,那么非阻塞 I/O 不会加快处理速度。它所要做的就是让你用更少的线程做同样的工作。如果当前线程数很少(例如 4),那么这不是胜利。
  • @StephenC 如果“程序运行得更快”通过注释掉 readLine() 我怀疑等待他拥有的线程中的输入会减慢它的速度。在另一个线程中阅读会产生类似的效果,但也可以阅读。
  • 彼得 - 我不明白你在说什么。是的,等待输入会减慢应用程序的速度。然而,大概输入是>>需要
  • 我猜你是否可以将处理与读数重叠(你的第二个建议),但这只有在每个线程上足够大比例的时间用于处理数据时才有效。这里另一个不可估量的是协议是同步的还是异步的。如果它是同步的,那么使用单独的读取线程进行流水线化可能不会有效地加速应用程序
【解决方案2】:
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];

【讨论】:

    【解决方案3】:

    听起来您的应用程序是网络绑定的。基本上,网络(或连接另一端的服务器或客户端)无法传递足够的数据数据以保持线程忙碌。

    您不太可能在此应用程序中做任何事情来显着提高吞吐量。通过让另一端运行得更快......或获得更快的端到端网络连接,您可能会获得一些牵引力。


    看起来,我有多个线程,但它们都从单个 BufferedReader 或类似的东西读取。

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

    【讨论】:

    • 假设我有 1000 行数据。我把它放在四个数组中,然后将它们传递到 4 个线程中,在那里我写入 PrintWriter 并从 BufferedReader 读取。为了处理这 1000 行,我花了 1 分钟。如果我用 2 个数组做 2 个线程(相同的 1000 行,除以 500),我仍然会花费 1 分钟。但是,如果我停止从 BufferedReader 读取,使用 4 个线程,工作将在 15 秒内完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    相关资源
    最近更新 更多