Java 多线程能工作得更快吗?

Java 多线程能工作得更快吗?,java,multithreading,Java,Multithreading,我有两台机器(Intel Atom(TM)CPU D525),每台都运行不同的操作系统(1台windows 7和1台ubuntu 10.04) 我想从Windows7机器向Ubuntu机器发送一堆图像 我现在使用多线程来做这件事。我已在下面附上我的代码: public class RshScp implements Runnable { private StreamHandlers streamHandlers = new StreamHandlers(); private String s

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

我想从Windows7机器向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秒钟。有时它仍然会丢失图像


有人知道到底发生了什么导致多线程速度变慢吗?有没有什么解决方案可以让它更快地连接和发送呢?

好吧,很难说清楚,因为你没有给我们一段有趣的代码,它可以通过网络将字节发送到另一台机器上。但这是我的建议:

  • 了解您的网络速度,以及将图像发送到另一台机器并接收结果所需的时间
  • 从这一点出发,计算出在机器之间分配处理是否值得
  • 如果计算表明它是值得的,不要用愚蠢的废话将数据发送到另一台机器的方式复杂化
有人知道到底发生了什么导致多线程速度变慢吗? 是否有任何解决方案可以使其连接和发送更快

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

如果您有“等待”时间等待未“利用”的I/O,则多线程是有意义的

e、 如果程序在线程“阻塞”I/O操作时有一些工作要做,那么添加另一个线程可能是有意义的


例如,如果您读取图像并将其写入文件,如果在“消费者-生产者”作业中使用两个线程(一个线程读取并放入缓冲区,一个线程从缓冲区读取并写入文件,例如使用

问题最可能的原因是并行文件传输命令导致网络拥塞问题。听起来你的问题可能会因为这种现象而变得更加复杂

你能做些什么

最简单的方法是减少并行网络连接的数量,直到问题解决为止。如有必要,每次进行一次传输

如果你真的很感兴趣,你可以在你的网络上使用数据包嗅探器,看看你是否能发现问题。但是您需要知道如何解释网络流量


无论如何,问题可能只是你的网络链路饱和了。唯一的解决办法是获得更快的连接。。。或者不要同时发送那么多文件。

'连接并将文件发送到客户端需要5秒钟'

一根线需要多长时间

“有时它仍然会丢失图像”-这是任何基于TCP的传输的担忧。即使您有50个线程,在正确实现的系统上也不会发生这种情况

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

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


首先-修正你的转移!即使线程数不适当,数据也不应丢失

在多线程环境中,I/O总是比实际执行有意义的工作慢。仅仅多线程并不能加快机器之间的传输,因为它还依赖于网络连接。一次或多次传输将占用相同的带宽。你应该尝试重新使用与服务器的连接,在发送之前压缩图像,以及其他类似的东西来加快速度。桑迪:我需要同时将文件发送到3个客户端。你说重新使用连接。如何实现@Makoto。。谢谢你的建议,我会尝试研究这种方法。你确定你一直都是线程安全的吗?您的代码和您正在使用的任何其他类?丢失的图像听起来像是线相互干扰。这可能也会使运行速度变慢。@Ralphcapin,我不确定线程是否都安全,因为当我尝试使用上面的代码发送文件时,有时会因为文件丢失而丢失。u表示线程相互干扰。我怎么知道呢?我该怎么做才能防止呢?提前感谢Hanks@Martin James的回复。你能告诉我哪里是我做错的,因为我完全不知道哪里是错的,结果我传输的文件会丢失。提前谢谢