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