Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程和多缓冲读取器_Java_Multithreading_Java Io - Fatal编程技术网

Java 多线程和多缓冲读取器

Java 多线程和多缓冲读取器,java,multithreading,java-io,Java,Multithreading,Java Io,我有一个创建4个线程的程序。在每个线程中我创建一个tcp连接。每个连接都有它的BufferedOutputStream和BufferedReader。每个tcp连接都由单独的线程处理每个线程的目的是处理我在其中传递的数组。问题是,运行每个线程所花费的时间并不随我创建的线程数量而变化。经过长时间的嗅探,我发现问题在于从InputStream中读取,精确到第行,而((line=reader.readLine())!=null){do stuff}当我注释这行代码时,程序运行得更快,应该如此我同意线程


我有一个创建4个线程的程序。
在每个线程中我创建一个tcp连接。
每个连接都有它的BufferedOutputStream和BufferedReader。
每个tcp连接都由单独的线程处理
每个线程的目的是处理我在其中传递的数组。
问题是,运行每个线程所花费的时间并不随我创建的线程数量而变化。
经过长时间的嗅探,我发现问题在于从InputStream中读取,精确到第行
,而((line=reader.readLine())!=null){do stuff}

当我注释这行代码时,程序运行得更快,应该如此
我同意线程在从流读取时被阻塞,这需要1秒钟,但如果我增加线程数,则必须更快地完成任务
但在我的情况下,在1个或4个线程中,我处理相同的数据,相同的时间。
我做错了什么?请帮助我。

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

我建议你要么使用

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

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

我建议你要么使用

  • 非阻塞IO(不容易)
  • 使用线程进行读取,或
  • 重新考虑您的设计,期望readLine()能够阻止
FileInputStream在每次读取时都执行I/O操作,并同步所有方法调用,以确保线程安全。为了减少这种开销,一次将多个字节读入一个字节缓冲区数组
FileInputStream f=新的FileInputStream(名称);
enterbyte[]barray=新字节[大小];
长校验和=0L;
国际nRead;
而((nRead=f.read(barray,0,SIZE))!=-1)
对于(int i=0;i
FileInputStream,它在每次读取时执行i/O操作,并在所有方法调用上进行同步,以确保线程安全。要减少此开销,请将多个字节一次读取到字节的缓冲区数组中
FileInputStream f=新的FileInputStream(名称);
enterbyte[]barray=新字节[大小];
长校验和=0L;
国际nRead;
而((nRead=f.read(barray,0,SIZE))!=-1)

对于(int i=0;i来说,您的应用程序听起来像是受网络限制的。基本上,网络(或连接另一端的服务器或客户端)无法提供足够的数据以保持线程繁忙

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


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


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

听起来您的应用程序是网络绑定的。基本上,然后是网络工作(或连接另一端的服务器或客户机)无法提供足够的数据以保持线程繁忙

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


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


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

如果每个TCP连接都有自己的读卡器,为什么您怀疑所有线程都被阻止使用相同的读卡器?如果每个TCP连接都有自己的读卡器,为什么您怀疑所有线程都在使用相同的读卡器?呃…如果线程大部分时间被阻塞,那么非阻塞I/O将不会加快处理速度。所有这些都将允许您使用较少的线程执行相同的工作。如果线程数量当前很小(例如4)那么这不是一场胜利。@StephenC如果通过注释掉readLine()使“程序运行得更快”我怀疑在他拥有的线程中等待输入会减慢速度。在另一个线程中阅读会有类似的效果,但也能阅读。Peter-我不明白你在说什么。是的,等待输入会减慢应用程序的速度。但是,我猜输入可能是>>需要我猜你是否可以重叠pro放弃阅读(你的第二个建议)但是,只有在每个线程上有足够大的时间用于处理数据时,这才有效。另一个无法估量的问题是协议是同步的还是异步的。如果协议是同步的,那么使用单独的读取线程进行管道传输可能无法有效地加快应用程序的运行速度…如果线程e大部分时间被阻塞,那么非阻塞I/O将不会加快处理速度。所有这些都会让你用更少的线程完成同样的工作。如果线程数目前很小(例如4个),那么这不是一个胜利。@StephenC如果通过注释掉readLine()使“程序运行得更快”我怀疑在他拥有的线程中等待输入会减慢速度。在另一个线程中阅读会有类似的效果,但也能阅读。Peter-我不明白你在说什么。是的,等待输入会减慢应用程序的速度。但是,我猜输入可能是>>需要我猜你是否可以重叠pro阅读
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];