多线程可以更快地工作吗?

时间:2012-05-10 03:26:27

标签: java multithreading

我有2台机器(Intel Atom(TM)CPU D525),每台机器运行不同的操作系统(1个Windows 7和1个ubuntu 10.04)。

我希望将一堆图像从Windows 7机器发送到Ubuntu机器。

我现在使用多线程来做到这一点。我在下面附上了我的代码:

public class RshScp implements Runnable
{

private StreamHandlers streamHandlers = new StreamHandlers(); 
private String screenFileName;
private int clientIndex;
private SingletonServer ss = null;

public RshScp(String screenFileName, int clientIndex, SingletonServer ss)
{
    this.screenFileName = screenFileName;
    this.clientIndex = clientIndex;
    this.ss = ss;
} 

public void run()
{
    sendFileToClient();
}

public void sendFileToClient()
{
    try 
    {   
        DisplayClient dc = null;
        dc = ss.getClient(clientIndex);          

        String execution = sshFileRSH(dc.getHostName(), dc.getUserName(), screenFileName, dc.getRemoteDirectory(), dc.getLocalDirectory()); 
        log.write(execution);
        Process p1 = Runtime.getRuntime().exec(execution);              
        InputStreamReader isr = new InputStreamReader(p1.getInputStream());
        streamHandlers.checkStreamOutput("From RshScp", isr);
    } catch(Exception e){}
}

//Function to set the RSH SCP command
private String sshFileRSH(String hostName, String userName, String localFileNames, String remoteDirName, String localJobDirectory)
{
    String fileTransferCommand = "scp " + localFileNames;
    //String fileTransferCommand = "rsync --partial --progress --rsh=ssh " + localFileNames[0] + " " + localFileNames[1] + " " + localFileNames[2];

    String destinationCommand = userName + "@" + hostName + ":" + remoteDirName;

    String executionCommand = "";
     executionCommand = fileTransferCommand + " " + destinationCommand;

    return executionCommand;            
} // end function

}//end while class

当我尝试将文件发送到多个客户端时,我发现它很慢。它使用5秒连接并将文件发送到客户端。有时它仍然会丢失图像。

是否有人知道实际发生的事情会使多线程变慢?是否有任何解决方案可以使其连接和发送更快?

4 个答案:

答案 0 :(得分:1)

嗯,很难说清楚,因为你没有给我们一些有趣的代码,它实际上将网络中的字节发送到另一台机器。但这就是我的建议:

  • 找出您的网络速度,以及将图像发送到另一台计算机并收到结果需要多长时间
  • 从中可以看出,如果机器之间的分配处理实际上是值得的
  • 如果计算表明它是值得的,请不要过分复制将数据发送到其他计算机的方式,并且愚蠢无稽之谈。

答案 1 :(得分:1)

  

是否有人知道实际发生的事情会使多线程变慢?   是否有任何解决方案可以使其连接和发送更快?

正如Makoto所说,第一个瓶颈很可能是I / O

多线程在你所拥有的地方有意义等待"未使用的I / O时间"

e.g。如果程序有一些工作要做,而你的线程是"阻止"在I / O操作上,然后添加另一个线程可能有意义

例如,如果您阅读图像并将其写入文件,如果您在"消费者生产者中使用2个线程,则可能会略微提高性能。 job(一个读取并放入缓冲区,一个从缓冲区读取并写入文件,例如使用BlockingQueue

答案 2 :(得分:0)

问题的最可能原因是并行文件传输命令导致网络拥塞问题。听起来你的问题可能会因"buffer bloat"现象而加剧。

你能做些什么?

最简单的事情是减少并行网络连接的数量,直到问题发生。如有必要,一次进行一次转移。

如果您非常热衷,可以在网络上使用数据包嗅探器,看看是否可以发现问题。但是您需要知道如何解释网络流量。

无论如何,问题可能只在于您正在使网络链接饱和。唯一的解决方法是获得更快的连接...或者不要尝试同时发送更多。

答案 3 :(得分:0)

'它使用5秒钟连接并将文件发送到客户端'

Ho wlong用一个线程吗?

'有时它仍然会丢失图像' - 现在这让任何基于TCP的转移都令人担忧。即使您有50个线程,也不会在正确实现的系统上发生。

在典型系统中,传输速率受网络限制(已由许多其他人发布)。通过连续连接和断开连接的协议将小文件复制到多台计算机时,多线程传输可以提供最大的改进。在这种情况下,可以减轻网络延迟的影响,并可以预期大幅加速。

在仅在两台计算机之间传输大型文件的情况下,由于硬盘执行重叠写入多个文件,因此通过增加磁盘搜索很可能会淹没因避免连接/断开延迟而产生的任何改进。

首先 - 修复您的转移!即使线程数量不合适,数据也不应丢失!