`
withoutme_hw
  • 浏览: 9459 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

用Java实现多线程下载

 
阅读更多

计划做一个多线程下载的程序,强化一下对多线程的理解。计划第一步先做出一个多线程下载的基本功能,下一步做出断点续传等功能。

1.确定下载核心类的接口,接口代码如下,之前看过一大牛的代码,断点续传写得很不错,但是把URL中文件名的解析等工作都放到了下载类中,我觉得这样会导致这个类多担负了一个任务,而我这里,将URL中文件名的解析放到Client中去做,而Client可能是字符型的客户端,或者GUI,这都不会影响到下载核心类的实现。Client仅依赖于DownloadService这一接口,而DownloadService的具体实现可以变化而不影响Client。比如,我实现了两种DownloadService,一种 单线程,一种多线程的。客户端的代码无需改动。

2. 先实现单线程的下载,代码非常简单,如下。其中断点续传功能未实现。

其中需要用到连接的header设置文件header.properties,如下:

3. 实现多线程下载,代码如下:

4.字符客户端代码:

多线程实现测试结果如下:

单线程实现测试结果如下:

可以看到,使用8线程下载只用了18秒,最终平均速度为:107.75KB/s,而单线程下载却用了62秒,平均速度只有28.64KB/s,可见,多线程对下载的速度提升还是有很大帮助的。

而这里的多线程下载实现又有什么样的性能瓶颈呢?观察多线程下载的测试结果可以发现,刚开始速度非常快,等过了一段时间之后,速度明显有下降的趋势。这应该是因为,刚开始同时有多个线程下载,而到后来,某些线程下载完毕,只剩下极少数线程还在下载,并行降低,甚至退化成单线程下载,所以导致速度明显下降。

当然这里的实现可能还会存在诸多问题,并且断点续传还没有实现,希望最近能抽出一点时间来完成这个工作。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics