一种简易的多线程下载工具的实现
吉林农业科技学院招生就业办 付 宁
摘 要:线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线
程也就是同时开起好几个下载通道。本文首先对多线程的主要研究现状,与多线程下载相关的语言、技术以及开发工具等进行了研究,其次详细介绍了简单的多线程下载工具的编写过程,最后进行了功能测试以及相关软件的对比测试。
关键词:多线程 下载 断点续传
引言
网络下载技术一直是网络发展的重要推动力之一。原先的信息资源共享主要通过Web技术实现,即先把共享的文件放到服务器上,然后客户机便可以通过HTTP和FTP等协议从服务器下载这些文件,这就是所谓的C/S结构,采用的也是传统的单线程下载。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行,由此带来的线程调度问题。由于是多线程进行断点续传,还要考虑记录多个断点位置,且记录断点位置时也要考虑同步互斥等问题。所有这些都使得这一步比较复杂。但是可以明显提高网络文件的下载速度。在其他非下载类的软件中,加入下载功能有时也非常必要。如让自己的软件支持自动在线升级,或者在软件中自动下载新的数据进行数据更新,这都是很有用、而且很实用的功能。
一、相关技术简介
多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况。Java语言的一个重要功能特点就是内置对多线程的支持,能同时处理多个任务的功能强大的应用程序。
在Java中提供了类Java.lang.Thread来进行多线程编程。
类Thread在Java的软件包java.lang中定义,它的构造方法为:Public Thread(ThreadGroup group,Runnable target,String name); 其中,group指明该线程所属的线程组;target为实际执行线程体的目标对象,它必须实现接口Runnable;name为线程名。Java中的每个线程都有自己的名称,Java提供了不同Thread类的构造器,允许给线程指定名称。如果name为null时,则Java自动提供唯一的名称。
Java中编程实现多线程应用有两种途径:
一种是在用户自己的类中实现Runnable接口;
一种是创建用户自己的线程子类,无论哪种方法,都需要使用到Java基础类库中的Thread类及其方法。
二、总体分析和设计
1、下载任务实体类的基本功能分析
对于多线程下载工具来说,下载任务的所有信息应该被第一在一个实体类中。在下载之前,首先要知道下载任务对应的URL地址,换句通俗的话说,就是要知道从哪里来下载文件;其次需要知道下载任务对应的文件大小,文件的大小以字节数来衡量;然后需要知道下载任务要使用几个线程,这样才能根据文件总数的大小来计算出每个线程要下载的那一小段的大小;最后还需要知道下载完的文件存放的目录和存放的文件名。
2、系统工具类的基本功能分析
系统工具类主要负责定义测试连接URL是否有效的方法以及获取要下载的资源文件名称、长度和MIME信息的方法。
+0.213X7+0.525X8+0.058X9计算各位老师的综合得分并进行系统评价。
根据4个主成份,先计算各个老师的主成分得分F1、F2、F3、F4。再以各主成分的方差贡献率占4个主成分总方差贡献率的比重作为权重进行汇总,得出各位老师的综合得分F即
F=(40.422*F1+24.554*F2+13.716*F3+9.825*F4)/88.516结果如表三若某个老师的得分为正,则表示该老师的教学综合业务能力在平均水平之上;反之,则在平均水平以下。
四、结论
通过上面的讨论可以知道,主成分分析能对教师做出比较客观的评价,教师基本都能接受评判结果。通过计算综合
得分,每位教师可以看到自己的长处与不足,能有针对性地改进自己的工作。作为教学主管部门能对高分的老师给予奖励,对低分老师进行帮助,使教学评估对提高教学质量起到实际意义。
参考文献:[1] 叶双峰:《关于主成分分析做综合评价的改进》,《数理统计与管理》,2001,20(2)。
[2] 高惠旋:《应用多元统计分析》,北京大学出版社,2005年。
[3] 余建英等编:《数据统计分析与SPSS 应用》,人民邮电出版社,2003年。
[4] 林海明、张文霖:《主成分分析与因子分析的异同和SPSS软件》,《统计研究》, 2005,(3):69
79
INTELLIGENCE
科 技 天 地
3、线程下载类的基本功能分析
线程下载类负责每一个线程具体下载的实现细节,该类本身应该是一个线程类,在其中通过循环根据文件块的其实和结束位置执行文件的下载。
4、线程监听类的基本功能分析
线程监听类主要负责监听线程下载状态,该线程还创建定时器,每秒执行一次,用于计算下载速度,此外该类还定义判断线程下载是否结束或者出错的方法。
5、多线程调度类的基本功能分析
多线程调度类是整个程序运行的核心,其中并没用过多的逻辑定义,而是定义整个程序的执行流程。它通过下载任务实体类对象的信息,创建多个线程下载类对象和线程监听类对象,实现多线程的调度。
6、用户界面的基本功能分析
对于一个好的应用程序来说,友好的用户界面是必不可少的。本系统的用户界面有多个类组成,包括下载文件属性面板、添加下载任务对话框、按钮工具条类等。
三、系统详细设计1、创建系统工具类
使用JCreatot创建一二新的类DownLoadUtil,其详细代码见附录A_1。
系统工具类在整个系统中是属于游离于核心功能之外的应用类。在很多系统的设计过程中,开发人员将那些很多类都需要调用的方法和属性集中生面在一个类里面吗,这样的类就是系统工具类。系统工具类的声明有雷雨软件的服用和系统的功能扩展。
2、创建下载任务实体类
使用JCreator创建一个新的类DownloadInfo,其详细代码见附录A_2。
下载任务实体类是用来抽象描述实际下载任务的,它实际上是一个POJO类。所谓POJO类,指的是包含一些属性及其getter和setter方法的类,当然在类中也可以有更简单的运算属性,但不允许含有业务方法。这种类是用来描述和传递信息的。
3、创建线程下载类
使用JCreator创建一个新的类DownLoadThread,其详细代码见附录A_3。
线程下载类中最关键的功能就是根据分配给该线程的下载起始位置和下载结束位置,通过循环将文件段通过网络输入流读入,然后通过文件输出流写出到临时文件。
在本系统的实现过程中,需要定义的一个线程下载类,这也是该设计系统中的核心技术。下面为线程下载类的大框架。
**
*功能:下载线程类*/
import java.io.*;import java.net.*;
public class DownLoadThread extends Thread{
public DownLoadThread(DownLoadInfo downInfo,int threadId)
{
//构造函数}
・・・・・・・・・・・・・・・・・・・・・・・・/**
*功能:获取线程下载是否结束标志*返回值:boolean*/
public boolean isFinished(){
return finished;}/**
*功能:获取线程下载是否出错标志*返回值:boolean*/
public boolean isError(){
return err;
//覆盖Thread类中的run()方法 public void run(){
/*在其中实现根据下载的起始位置和结束位置*下载文件某一小段的逻辑代码*/}}
4、创建线程监听类
使用JCreator创建一个新的类ListenThread,其详细代码见附录A_4。
线程监听类的主要作用就是监听某个下载任务的多个线程是否全部结束,其实现方式就是采取轮询的形式,对下载任务对象中的每个线程分别查询器对应的下载完成标志位是否为true,如果不是将继续查询下一个,全部查询后将重新开始下一轮的轮询,直到全部线程下载结束为止。
5、创建多线程调度类
使用JCreator创建一个新的类MultiDownLoad,其详细代码见附录A_5.
多线程调度类相对来说比较简单,它是一个应用类,本身没有定义任何业务逻辑,只是根据程序执行的流程分别调用前面声明的各个逻辑类的对象。
6、创建用户界面类
用户界面类有四个类组成,分别是ItemPane 类,下载文件属性面板。MainFrame类,应用程序主窗口。
TaskDialog类,添加下载任务对话框。ToolPane类,主窗口下方按钮工具条。结束语
本文设计的多线程下载工具,能够实现线程的创建,链接的测试,线程的监听,下载功能实现,包括单线程下载功能,多线程下载功能,断点续传功能。通过使用同一个URL地址下载同一个文件与其他的下载工具反复比较发现多线程下载工具下载速度相对来说要稍微慢一些,但是他占用的系统资源要比其他工具要少的多。
参考文献:
[1] 刘升华等:《Java 从入门到实践》,清华大学出版社,2009年9月。
[2] 周恒民译:《JavaTCP/IP Socket 编程》,机械工业出版社,2009年1月。
80
因篇幅问题不能全部显示,请点此查看更多更全内容