Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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_Performance_Download - Fatal编程技术网

Java 使用多线程下载是否真的会加快速度?

Java 使用多线程下载是否真的会加快速度?,java,multithreading,performance,download,Java,Multithreading,Performance,Download,所以,几天前我启动了minecraft,打开它的开发者控制台,看看它在自我更新时做了什么。我注意到其中一行写着: Downloading 32 files. (16 threads) 现在,我想到的第一件事是:处理器一次只能做一件事,所有线程所做的就是将它们的每个任务拆分,并在它们之间分配CPU能力,那么,如果每个线程仍然只在单个处理器上运行,那么在多个线程上下载多个文件的目的是什么呢 然后,在决定是否应该这样问这个问题的过程中,我记得多个内核可以驻留在一个处理器上。例如,我的处理器是四核的。

所以,几天前我启动了minecraft,打开它的开发者控制台,看看它在自我更新时做了什么。我注意到其中一行写着:

Downloading 32 files. (16 threads)
现在,我想到的第一件事是:处理器一次只能做一件事,所有线程所做的就是将它们的每个任务拆分,并在它们之间分配CPU能力,那么,如果每个线程仍然只在单个处理器上运行,那么在多个线程上下载多个文件的目的是什么呢

然后,在决定是否应该这样问这个问题的过程中,我记得多个内核可以驻留在一个处理器上。例如,我的处理器是四核的。因此,您实际上可以同时完成4次下载。这听起来很有道理。除了有16个线程用于minecraft的下载之外。所以,基本上我的问题是:

在下载过程中增加线程数是否有助于提高速度?(假设是多核处理器,线程数小于核心数。)


如果将线程数增加到超过核心数,速度是否仍会增加?(在我看来,在四核处理器上,4个线程之后的下载速度是最高的。)

下载受网络限制,而不是CPU限制。因此,从理论上讲,使用多个线程并不会使它更快

一方面,如果您的程序使用同步(阻塞)I/O下载,那么多线程只会减少阻塞的发生。通常,另一方面,只使用带有异步I/O的单个线程更明智


另一方面,异步I/O比同步I/O(非常简单)更难正确编码。因此,开发人员可能刚刚决定支持编程的简单性而不是纯粹的性能。(或者他们可能倾向于与旧的Java平台兼容:真正的异步I/O只在NIO2(Java 7附带)上可用。

通常不会更快,但总会有例外

假设每个下载线程都打开了一个新连接,那么如果

  • 网络(您自己的网络或目标系统)正在限制每个连接的下载速度,或者
  • 您正在从多个服务器下载,等等
  • 或者,如果“下载”不是简单的下载,而是下载一些东西并对其进行CPU密集型处理


    在这种情况下,当有多个线程时,您可能会看到下载速度加快。

    当一个线程下载一个文件时,它将花费一些时间等待。当一个线程一个接一个地下载N个文件时,它将平均花费总等待时间的N倍

    当N个线程每次下载一个文件时,这些线程中的每一个都会花费一些时间等待,但其中一些等待会重叠(例如,线程A和线程B都在同时等待)。最终结果是,获取所有N个文件可能需要更少的挂钟时间

    另一方面,如果线程正在等待来自同一服务器的文件,则每个线程的单独等待时间可能更长


    是否存在总体性能优势的问题取决于客户端、服务器和可用网络带宽。如果网络传输字节的速度不如服务器输出字节的速度快,那么多线程客户端可能不会节省任何时间,如果服务器是单线程的,那么多线程客户端肯定不会有帮助,但是如果条件合适的话(例如,如果您具有快速的internet连接,尤其是如果文件来自服务器场而不是单机),那么多线程可能会加快速度。

    可能不会。除非你有多个internet连接。有趣的是,你能解释一下同步IO和异步IO之间的区别吗?@AndrewG这里有一个例子。如果你想让我解释一下,我可以试一下。另一方面,抱怨的是……这次失去的动力是什么?:)这仍然采用同步I/O模型。正如我的回答所指出的,有几种方法可以只使用一个线程同时下载多个文件。关于“同步I/O”,没错,除了使用来自多个线程的同步调用来重叠I/O之外,还有其他方法,但问题特别是关于使用线程。这就是为什么我的答案只涉及线程。