多线程下载原理详解:如何高效实现文件分段下载与写入
原则:

多线程下载,顾名思义,就是开启多个线程来下载文件,每个线程负责一部分。
有两种方法可以实现此目的:
1、多个线程同时下载并写入同一个文件。也就是说,获取到文件的总长度后,在本地生成一个相同大小的文件,然后每个线程分别下载并写入该文件。 。
例如:一个文件总大小为6M,分3个线程下载,则本地会先生成一个6M大小的文件,然后3个线程同时下载并写入该文件。不同的是,线程1从0位置开始写入,线程2从2*1024*1024位置开始写入,线程3从4*1024*1024位置开始写入!所有线程下载完成后,文件就已经下载完毕!
2.还是和第一种方法一样,分部分下载。还是上面的例子,三个线程分别生成一个文件(这个文件的大小不需要提前指定),下载完之后拼接成一个文件。就是这么简单。
在这两种方法中,需要明确的是:每个线程从哪里开始读取?清楚这一点。如果你从头开始读每一篇,它就会失败。还有一点就是,下载的时候,不是第一个线程一定要跳转到指定的位置才开始下载,否则所有下载的都会是第一段。那有用吗?
两种方法相比,其实第一种更方便。你只需要关注每个线程从哪里开始写,写,写。就是这样。第二种代码稍微多一点,然后还有一个难点:最后一步是合并文件。合并文件本身并不困难。困难的是何时合并?只有当所有线程都下载完毕后才进行合并,否则会很乱!哈哈
我们看下面的代码,纯java代码!
这个demo不太实用! (因为不监听下载完成动作,这里有一个想法:可以在每个线程中添加下载完成时的回调)
我们先看一下单线程下载:
这里解释一下,200-212行是初始方法,全部下载。第214-233行是另一种方式,这就是我们接下来要做的,下载指定的段。当然,这里是从头到尾的下载文件!
我们看一下下载线程的代码:
代码注释也可以看得清楚,这里不再解释;
最终下载代码,分段下载
这里虽然连接了互联网,但只是获取了文件的总大小,而没有下载。获得总大小后,计算每个段的大小。
然后分。
以下是每个线程所需的 4 个参数。第一个是地址。第二个是线程 ID。这两个没什么好解释的。然后第三个是起始位置。这里我就直接 * i 因为 i =0 也是正确的。它直接从0(文件头)开始下载。这里最后一个参数就是 * i+1 。嗯,差不多就是这样了。我这里有一个判断。如果是最后一个线程,那么就直接给0(因为我对下载线程做了判断,如果最后是0,就直接下载到文件末尾)。也可以传到这里。文件的总大小也是正确的,但是你必须直接传递section *(i+1),因为大家都知道,无论是long还是int,如果不划分就会丢失。例如,如果文件大小为 10,则分 3 个线程下载。如果您不知道,请分别下载0-3、3-6、6-9。用手指数一下。你总共下载了9个,总大小是10对吧?去打开这样一个文件看看能不能打开? (前提不是文本文件。文本文件大概可以打开,哈哈!)
最后一步是合并文件:
好吧,我们先到此为止,稍后再升级。
主题:
Java_Thread-线程
Java_Threads—经典示例:门票销售
Java_Threads—经典示例:生产者和消费者
java_多线程下载