本文测试了多种方式下载文件,借以学习多线程。
这个包是单线程下载方法的实现
SingleThreadDownload |
单线程方法下载 |
这个包是多线程下载方法的实现,而且不带有线程池
MultiThreadDownload |
主方法(创建多线程,执行下载) |
DownLoad_Thread |
通过继承Thread实现线程方法 |
DownLoad_Runnable |
通过实现Runnable接口实现线程方法 |
这个包是多线程下载方法的实现,带有线程池。
通过线程池的shutdown()方法和awaitTermination()方法实现下载时间的统计。
原理是:线程池不接受新请求,等待所有线程任务执行完毕后,再执行主线程的后续代码。
MultiThreadDownloadWithPool |
主方法(通过线程池,提交线程任务,执行下载) |
DownLoad_Runnable_pool |
跟multi_thread_no_poo包里面的DownLoad_Thread方法内容一致,一模一样复制过来 |
这个包是多线程下载方法的实现,带有线程池。
通过CountDownLatch类来实现下载时间的统计。
原理是:计数器+阻塞队列。通过设置计数器的值(等于任务数),然后通过await()方法将当前线程加入阻塞队列;然后每个任务执行完毕后,调用countDown()方法使得计数器的值-1;当计数器的值等于0时,会唤醒阻塞队列里面的线程。
| 方法 | 时长(毫秒) | |
|---|---|---|
| 单线程 | 4300 | |
| 继承Thread实现多线程:1 | 4300 | |
| 继承Thread实现多线程:2 | 2300 | |
| 继承Thread实现多线程:3-8 | 2300 | 时长基本没变化 |
| 继承Thread实现多线程:100 | 5600 | 时长变长且连接会过期,需要延长连接时间 |
| 实现Runnable接口实现多线程 | 各线程数量的运行时间基本同于Thread | |
| 通过ThreadPoolExecutor创建线程池,Runnable提交任务:1 | 4300 | |
| 通过ThreadPoolExecutor创建线程池,Runnable提交任务:2-n | 时长基本同上 |