多线程高速下载器,文件下载进度实时预览

  • Post author:
  • Post category:其他




多线程高速下载器,文件下载进度实时预览



前言

需要说明的是,对于多线程是否比单线程更能有效提高下载速度,这个是存在争议的,但大体上来看,多线程下载速率不会比单线程下载速率低,不论是从tcp拥塞控制算法,滑动窗口大小,线程抢占带宽,以及服务端限速等哪种角度,均有此结论。对此有兴趣的小伙伴可移步至:


为什么多线程能加速


多线程分块下载能加快下载速度麽


多线程下载一个大文件的速度更快的真正原因是什么?

有不同意见或者观点的小伙伴,也欢迎在评论区留下你的脚步。

重要的东西要放在前面,需要代码的,请直接clone

high-speed-downloader

,如果方便的话,还请在clone后,给个star,感激不尽



实现方式

采取分段的方式,每段由单个线程下载,下载时会记录下载量,manager负责分发任务,并获取每个任务的实时下载量,图示说明可能更简洁:

在这里插入图片描述



关键点


  1. 多线程实现

    :manager中有线程池,可为下载任务分配子线程下载片段


  2. 如何统计实时下载进度

    :每一个任务生成一个上下文,任务上下文携带AtomicLong类型downSize局部变量(用于记录当前任务下载量)。在任务上下文传递至各子线程后,子线程每下载一段,便在downSize基础上累加


  3. 如何确保子线程在线程池环境中,不丢失上下文?

    :第一种,使用jdk自带的InheritableThreadLocal,但这个类在线程池环境下依然会存在上下文丢失的情况。第二种,使用阿里开源的TransmittableThreadLocal,详细设计可移步至:

    alibaba/transmittable-thred-local

    。目前此下载器采取的该方案



总结



不足
  • 暂未实现断点续传功能,这个在单线程场景下比较容易实现,多线程,线程池场景下实现比较麻烦

  • 未实现根据任务配置线程数下载,这个比较容易改进,留给有次需求的小伙伴改进



优点
  • 实现简洁,依赖较少
  • 下载高效,下载状态可实时预览



版权声明:本文为Justnow_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。