Java多线程与线程安全实践——
基于Http协议的断点续传
摘 要
现实世界中的很多过程都具有多条线索同时动作的特性。Java语言的一大特性就是内置对多线程的支持。多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编程人员可以很方便地开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。一些同时运行的线程需要共享数据,因此每个线程就必须要考虑其它与它一起共享数据的线程的状态与行为,这就是线程安全的问题。为了对Java多线程与线程安全机制进行研究与实践,特此设计一个基于Http 协议的支持多线程断点续传的下载程序。此下载程序由下载任务模块、设置模块以及系统帮助模块组成。通过Apache Jakarta Commons下的子项目HttpClient包对Http协议进行支持,从而下载服务器端的资源。程序提供多线程断点续传功能,在完成下载过程中使用多线程技术可以较大幅度地提高下载的速度。
关键词:多线程;线程安全;断点续传
1.1 课题的研究背景与意义 1
1.1.1 课题的研究背景 1
1.1.2 课题的研究意义 1
1.2 可行性分析 2
1.2.1 技术可行性 2
1.2.2 操作可行性 2
2相关基础知识以及开发平台 2
2.1 JAVA中的多线程与线程安全 3
2.1.1 Java中的多线程 3
2.1.2 Java中的线程安全 3
2.2 Http协议简介 4
2.3 断点续传原理 4
3 需求分析 5
3.1用户需求分析 5
3.2 业务流分析 6
4. 系统设计 7
4.1 系统设计要点 7
4.2 系统总体功能结构 7
5.系统实现 8
5.1用户界面实现 8
5.2 下载任务实现 11
5.2.1 下载任务类图 11
5.2.2 下载任务顺序图 12
5.2.3 下载任务具体实现 13
5.3 监控下载信息设计 18
5.3.1 监控下载信息类图 18
5.3.2 监控下载信息顺序图 19
5.3.3 监控下载信息实现 19
结 论 22
参考文献 23
致 谢 24
声 明 25
引言
1.1 课题的研究背景与意义
xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />
以往我们开发的程序大多是单线程的,即一个程序只有一条从头至尾的执行线索。然而现实世界中的很多过程都具有多条线索同时动作的特性。例如,我们可以一边看电视,一边活动胳膊,如果不容许这样做,我们会感觉很难受。再如一个网络服务器可能需要同时处理多个客户机的请求等。
Java语言的一大特性就是内置对多线程的支持。多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编程人员可以很方便地开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。虽然执行线程给人一种几个事件同时发生的感觉,但这只是一种错觉,因为我们的计算机在任何给定的时刻只能执行那些线程中的一个。为了建立这些线程正在同步执行的感觉。Java快速地把控制从一个线程切换到另一个线程。
多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。
自从“多线程下载”技术发明以来,这项技术得到前所未有的关注已是不争的事实。在“网络蚂蚁”软件流行开后,许多下载软件也都纷纷效仿,是否具有“多线程下载”技术、甚至能支持多少个下载线程都成了人们评测下载软件的要素。“多线程下载”的基础是WEB服务器支持远程的随机读取,也即支持“断点续传”。这样,在下载时可以把文件分成若干部分,每一部分创建一个下载线程进行下载。
1.1.2 课题的研究意义
多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行,由此带来的线程调度问题。由于是多线程进行断点续传,还要考虑记录多个断点位置,且记录断点位置时也要考虑同步互斥等问题。所有这些都使得这一步比较复杂。但是可以明显提高网络文件的下载速度。
现在,不要说编写专门的下载软件,在自己编写的软件中,加入下载功能有时也非常必要。如让自己的软件支持自动在线升级,或者在软件中自动下载新的数据进行数据更新,这都是很有用、而且很实用的功能。
1.2 可行性分析
可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。要达到这个目的,必须分析几种主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度。因此,可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。
系统的可行性分析主要包括技术上的可行性和操作上的可行性。本系统的可行性分析如下:
下载程序功能模块的实现主要利用了面向对象的Java高级编程语言。使用Java作为开发工具主要是因为Java是目前比较流行而且非常成功的编程语言。
多线程编程技术是Java语言的重要特点。多线程编程的含义是将程序任务分成几个并行的子任务。特别是在网络编程中,有很多功能是可以并发执行的。
Java中实现多线程的类有两种方法:1.扩展java.lang.Thread类,用它覆盖Thread类的run方法。2.生成实现java.lang.Runnable接口的类并将其它的实例与java.lang.Thread实例相关联。
Thread类是负责向其它类提供线程支持的最主要的类,要使用一个类具有线程功能,在Java中只要简单地从Thread类派生一个子类就可以了。扩展Thread类,如printThread.java。
由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。
由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。
本系统使用Eclipse的SWT图形界面技术进行开发,以HttpClient包进行支持,上述两个软件或是开发包均为免费下载,十分方便。
下载程序的具备友好的用户界面,而且操作简单易于被用户接收,使用此下载程序十分方便,因为软件的操作思路比较清晰,而且用户实际操作的内容较少,所以用户只需要熟练操作计算机即可。因此从使用操作方面看,此系统得开发是可行的。
参考文献
耿祥义,张跃平.JAVA 2实用教程(第二版)[M].北京:清华大学出版社,2004.
霍尔泽.Eclipse集成开发工具[M].南京:东南大学出版社,2005.
张桂元,贾燕枫.Eclipse开发入门与项目实践[M].北京:人民邮电出版社,2006.
叶达峰.Eclipse编程技术与实例[M].北京:人民邮电出版社,2006.
陈刚.Eclipse从入门到精通[M].北京:清华大学出版社,2005.
Hughes,Shoffner,Hamner,Java网络编程技术内幕[M].北京:国防工业出版社,2002.
Horstmann,Cornell.Java2核心技术卷I:基础知识[M].北京:机械工业出版社,2003.
Bruce Eckel.Java编程思想[M].北京:机械工业出版社,2005.
刘亚宾,杨红.精通Eclipse[M]. 北京: 电子工业出版社,2004.