多线程高速下载器,文件下载进度实时预览
前言
需要说明的是,对于多线程是否比单线程更能有效提高下载速度,这个是存在争议的,但大体上来看,多线程下载速率不会比单线程下载速率低,不论是从tcp拥塞控制算法,滑动窗口大小,线程抢占带宽,以及服务端限速等哪种角度,均有此结论。对此有兴趣的小伙伴可移步至:
有不同意见或者观点的小伙伴,也欢迎在评论区留下你的脚步。
重要的东西要放在前面,需要代码的,请直接clone
high-speed-downloader
,如果方便的话,还请在clone后,给个star,感激不尽
实现方式
采取分段的方式,每段由单个线程下载,下载时会记录下载量,manager负责分发任务,并获取每个任务的实时下载量,图示说明可能更简洁:
关键点
-
多线程实现
:manager中有线程池,可为下载任务分配子线程下载片段 -
如何统计实时下载进度
:每一个任务生成一个上下文,任务上下文携带AtomicLong类型downSize局部变量(用于记录当前任务下载量)。在任务上下文传递至各子线程后,子线程每下载一段,便在downSize基础上累加 -
如何确保子线程在线程池环境中,不丢失上下文?
:第一种,使用jdk自带的InheritableThreadLocal,但这个类在线程池环境下依然会存在上下文丢失的情况。第二种,使用阿里开源的TransmittableThreadLocal,详细设计可移步至:
alibaba/transmittable-thred-local
。目前此下载器采取的该方案
总结
不足
-
暂未实现断点续传功能,这个在单线程场景下比较容易实现,多线程,线程池场景下实现比较麻烦
-
未实现根据任务配置线程数下载,这个比较容易改进,留给有次需求的小伙伴改进
优点
- 实现简洁,依赖较少
- 下载高效,下载状态可实时预览