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