java_多线程下载
来源:互联网 发布:淘宝的攀升兄弟怎么样 编辑:程序博客网 时间:2024/06/07 06:08
原理:
多线程下载,故名思意,就是开启多个线程去下载文件,每个线程负责一部分。
实现有两种方式:
1、多个线程同时下载同时对同一个文件进行写的操作,也就是说,获取了文件的总长度后在本地生成一个大小一致的文件,然后每个线程分别对这个文件进行边下载边写。
例如:一个文件总大小是6M,分3个线程去下载,那么本地也先生成一个大小为6M的文件,然后3个线程一边下载一边的对文件进行写,不同的是,线程1从0的位置开始写,线程2从2*1024*1024的位置开始写,线程3是从4*1024*1024的位置开始写!全部线程下载完毕后,文件也就下载完毕了!
2、还是和第一种方式一样,分段下载。还是上面那个例子,3个线程分别生成一个文件(这个文件不需要事先指定大小),然后下载完后拼接成一个文件,就这么简单。
两种方式,都需要搞清楚的是:每个线程从哪里开始读?这点要清楚,如果每一个都从开始的位置读的话,那就挂了。还有一点就是,下载的时候,不是第一个线程要跳到指定位置开始下载,不然全部下载回来的都是第一段,有毛用?
两种方式的比较,第一种其实是比较方便的,只需要注意每个线程从哪里开始写,写,写。就可以了。第二种,代码量多一点,然后还有一个难点是:最后一步合并文件,合并文件本身没什么难度,难的是什么时候合并?只有所有的线程都下载完毕的时候才合并,不然就瞎掰了!哈哈
下面来看代码,纯java的代码!
本demo不怎么具备实用性!(因为没监听下载完毕的动作,给个思路,可以给每个线程下载完毕的时候加个回调)
先来看看单线程下载:
这里说明一下,line200-212是最初的方式,下载全部。line214-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_线程—经典的例子:售票
Java_线程—经典的例子:生产者和消费者
java_多线程下载
- java_多线程下载
- Java_多线程_断点_下载
- Java_多线程
- JAVA_多线程
- java_多线程
- java_多线程
- Java_多线程
- Java_多线程
- JAVA_多线程
- JAVA_多线程
- java_多线程
- java_多线程
- java_多线程死锁
- Java_多线程_简介
- JAVA_多线程讲解
- Java_多线程(上)
- Java_多线程(下)
- Java_多线程学习汇总
- linux学习:每天一个命令(2)---grep命令
- 在Centos7下发布.NET CORE项目
- 马蓉裸照 马蓉激情视频 知情人揭王宝强离婚内幕:其妻几月前开始婚外情
- Android UI 常用项目总结------/*自己编写*/
- taobao 爬虫基本思路分享
- java_多线程下载
- 直接利用Android手机破解微信加密数据库EnMicroMsg.db
- C#“如果应用程序没有控制台或控制台输入已通过文件进行了重定向,则无法读取键。”的解决方法
- xmlns:android="http://schemas.android.com/apk/res/android"详解
- 刷机
- Linux reboot全过程
- 平衡二叉树
- ASCII、Unicode和UTF-8的关系
- 一个简单的基于EntityQuery的 PDF.NET SOD CURD 帮助类 CURDHelper.cs