Java多线程下载器

Time: 2025-02-20 Thursday 23:56:01
Author: Jackasher

Java多线程下载器

该项目用于练习java多线程的学习,同时强化对io流,http的理解,使用分块多线程下载,最后合并的方式,同时实时记录下载的情况,下载数据,及网速,verion_01为单线程,version_02为多线程模块,是个合适的作为练习的项目

image-20250102234506141

image-20250102234519649

具体变量参数在Constant类里面调整

image-20250102234818101

程序简要说明

主类为Downloader,记录类为DownloaderInfoThread,实际下载类为Downloaderthread,通过地址建立Http连接

1
HttpURLConnection httpURLConnection = getConnection(url);

通过请求属性实现分片下载

1
httpURLConnection.setRequestProperty("Range", "bytes=" + startPosition + "-" + endPosition);

通过线程池实现每一秒记录信息

1
2
DownloadInfoThread downloadInfoThread = new DownloadInfoThread(httpFileContentLength);
scheduledExecutorService.scheduleAtFixedRate(downloadInfoThread, 1, 1, TimeUnit.SECONDS);

通过累计下载字节进行一系列数据的记录

1
2
3
//记录总共下载的字节数
//可以根据该变量获取速度,和判断剩余时间
public static volatile LongAdder downSize = new LongAdder();

通过线程池执行线程任务

1
2
3
DownloadThread downloadThread = new DownloadThread(url, startPostion, endPosion, i);
Future<Boolean> future = threadPoolExecutor.submit(downloadThread);
futureArrayList.add(future);

印象深刻的地方

一是,如何处理线程的异步问题,需要下载全部执行完成后再合并,我们的下载线程是继承的Callable,返回的是Future,将返回值装在集合里面,便利,通过future.get()阻塞,完成后进行合并,也可以使用CountDownLatch,每完成一个线程就countDown一下

二是,最后出现的磁盘损坏问题,经过排查发现是合并时出现问题,查询ai后发现,最后没有关闭缓冲流,导致缓冲流里面的内容没有写入文件,默认情况下缓冲流只会在充满,手动刷新,关闭的情况写入,所以推荐使用try-with-resources


Java多线程下载器
http://example.com/2025/02/20/Java多线程下载器/
作者
Jack Asher
发布于
2025年2月20日
许可协议