java多线程与线程安全实践基于ttp协议的断点续传—免费毕业设计论文[管理资料]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
毕业设计(论文)
Java多线程与线程安全实践——基于Http协议的断点续传
论文作者姓名:
申请学位专业:
申请学位类别:
指导教师姓名(职称):
论文提交日期:
Java多线程与线程安全实践——
基于Http协议的断点续传
摘要
现实世界中的很多过程都具有多条线索同时动作的特性。
Java语言的一大特性就是内置对多线程的支持。
多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编程人员可以很方便地开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。
一些同时运行的线程需要共享数据,因此每个线程就必须要考虑其它与它一起共享数据的线程的状态与行为,这就是线程安全的问题。
为了对Java多线程与线程安全机制进行研究与实践,特此设计一个基于Http 协议的支持多线程断点续传的下载程序。
此下载程序由下载任务模块、设置模块以及系统帮助模块组成。
通过Apache Jakarta Commons下的子项目HttpClient包对Http协议进行支持,从而下载服务器端的资源。
程序提供多线程断点续传功能,在完成下载过程中使用多线程技术可以较大幅度地提高下载的速度。
关键词:多线程;线程安全;断点续传
The Practice of Java Multithreading and Thread Security---- Download Tool with Broken/Resume Function based on http
Abstract
In real world, many processes have the characteristic that multi-strip clue act at the same time. The Java language has a major characteristic of embedded multithread support. Multithreading is the status that exist several implementation body at the same time, according to several different clues to the implementation of the joint work, It means that programmers can easily produce more threads development functions, It can also deal with a number of tasks powerful application. Running some of the threads need to share data, So each thread must consider other with it to share the data with the state of the thread, This is the thread safety. To Java multithreading and security mechanisms to conduct research and practice, Design hereby Http agreement on the support multithreading download procedures. This download procedures comprises of downloading task module, setting module and helping system module. With Http support of HttpClient, a subproject of Apache Jakarta Commons, it can download resources coming from web server. The procedure provides the Multi-threaded broken/resume functionality, in the process of completes downloading to use the multi-thread technology can greatly boost download speed.
Keywords: Multithreading; Thread security; Broken/Resume
目录
论文总页数:25页1引言 (1)
课题的研究背景与意义 (1)
课题的研究背景 (1)
课题的研究意义 (1)
可行性分析 (2)
技术可行性 (2)
操作可行性 (2)
2相关基础知识以及开发平台 (2)
JA V A中的多线程与线程安全 (2)
Java中的多线程 (2)
Java中的线程安全 (3)
Http协议简介 (4)
断点续传原理 (4)
3 需求分析 (5)
(5)
业务流分析 (6)
4. 系统设计 (7)
系统设计要点 (7)
系统总体功能结构 (7)
(8)
(8)
下载任务实现 (11)
下载任务类图 (11)
下载任务顺序图 (12)
下载任务具体实现 (13)
监控下载信息设计 (18)
监控下载信息类图 (18)
监控下载信息顺序图 (19)
监控下载信息实现 (19)
结论 (22)
参考文献 (23)
致谢 (24)
声明 (25)
1引言
课题的研究背景与意义
课题的研究背景
以往我们开发的程序大多是单线程的,即一个程序只有一条从头至尾的执行线索。
然而现实世界中的很多过程都具有多条线索同时动作的特性。
例如,我们可以一边看电视,一边活动胳膊,如果不容许这样做,我们会感觉很难受。
再如一个网络服务器可能需要同时处理多个客户机的请求等。
Java语言的一大特性就是内置对多线程的支持。
多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编程人员可以很方便地开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。
虽然执行线程给人一种几个事件同时发生的感觉,但这只是一种错觉,因为我们的计算机在任何给定的时刻只能执行那些线程中的一个。
为了建立这些线程正在同步执行的感觉。
Java快速地把控制从一个线程切换到另一个线程。
多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。
如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。
自从“多线程下载”技术发明以来,这项技术得到前所未有的关注已是不争的事实。
在“网络蚂蚁”软件流行开后,许多下载软件也都纷纷效仿,是否具有“多线程下载”技术、甚至能支持多少个下载线程都成了人们评测下载软件的要素。
“多线程下载”的基础是WEB服务器支持远程的随机读取,也即支持“断点续传”。
这样,在下载时可以把文件分成若干部分,每一部分创建一个下载线程进行下载。
1.1.2课题的研究意义
多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行,由此带来的线程调度问题。
由于是多线程进行断点续传,还要考虑记录多个断点位置,且记录断点位置时也要考虑同步互斥等问题。
所有这些都使得这一步比较复杂。
但是可以明显提高网络文件的下载速度。
现在,不要说编写专门的下载软件,在自己编写的软件中,加入下载功能有时也非常必要。
如让自己的软件支持自动在线升级,或者在软件中自动下载新的数据进行数据更新,这都是很有用、而且很实用的功能。
可行性分析
可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。
要达到这个目的,必须分析几种主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度。
因此,可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。
系统的可行性分析主要包括技术上的可行性和操作上的可行性。
本系统的可行性分析如下:
技术可行性
下载程序功能模块的实现主要利用了面向对象的Java高级编程语言。
使用Java作为开发工具主要是因为Java是目前比较流行而且非常成功的编程语言。
多线程编程技术是Java语言的重要特点。
多线程编程的含义是将程序任务分成几个并行的子任务。
特别是在网络编程中,有很多功能是可以并发执行的。
Java中实现多线程的类有两种方法:,用它覆盖Thread类的run方法。
Thread类是负责向其它类提供线程支持的最主要的类,要使用一个类具有线程功能,在Java中只要简单地从Thread类派生一个子类就可以了。
扩展Thread 类,。
由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。
Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。
由于我们可以通过private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是synchronized 关键字,它包括两种用法:synchronized 方法和synchronized 块。
本系统使用Eclipse的SWT图形界面技术进行开发,以HttpClient包进行支持,上述两个软件或是开发包均为免费下载,十分方便。
操作可行性
下载程序的具备友好的用户界面,而且操作简单易于被用户接收,使用此下载程序十分方便,因为软件的操作思路比较清晰,而且用户实际操作的内容较少,所以用户只需要熟练操作计算机即可。
因此从使用操作方面看,此系统得开发是可行的。
2相关基础知识以及开发平台
JAVA中的多线程与线程安全
Java中的多线程
Java不仅是一门语言,它已成为一门技术,例如Java芯片技术、Java编译技术、基于Java的信息家电联网技术(Jini)等,并以它的平台独立性、健壮性、Java虚拟机技术等特点受到广大编程者青睐。
Java能把所有东西从桌面计算机平稳地转换成基于网络的计算,它是Web浏览器中必须具备的技术,是一个完全面向对象的语言,是有利于处理网络协议的程序综合库。
线程是从一个完整应用程序分出的单独的处理步骤,是程序内部的一个顺序控制流。
一个小程序中可含1个或多个线程并可同时运行,由于单线程一旦运行就独占线程的所有时间资源,而多线程的出发点就是提高系统的并发性,因此,引人注意的不是一个单独的线程,而是在一个程序中实现多个线程,它意味着一个程序的多行语句同时执行,即用抢占资源的方式对多个线程实现轮流执行。
例如HotJava浏览器就是一个多线程的应用实例。
在Java语言中,多线程编程已成为编程的一个有效工具,可编制出界面友好、效率高的应用程序。
Java内在支持多线程,其线程由3部分组成:
(1)虚拟CPU,封装在Java.lang.Thread类中。
(2)CPU所执行的代码,传送给Thread类。
(3)CPU所处理的数据,传送给Thread类。
Java通过多线程有效地实现了多任务的并发执行,所以,在Java多线程编程中,不仅考虑多线程自身的问题分析,还应注意各线程在调度中出现的各种情况。
Java中的线程安全
当对一个复杂对象进行某种操作时,从操作开始到操作结束,被操作的对象往往会经历若干非法的中间状态。
调用一个函数(假设该函数是正确的)操作某对象常常会使该对象暂时陷入不可用的状态(通常称为不稳定状态),等到操作完全结束,该对象才会重新回到完全可用的状态。
如果其他线程企图访问一个处于不可用状态的对象,该对象将不能正确响应从而产生无法预料的结果,如何避免这种情况发生是线程安全性的核心问题。
线程同步提供了保证不同线程按适当顺序使用共享资源的工具。
线程可直接访问共享数据,既有相互之间高效通信的优点,也有线程间任意相互干扰的弊端。
安全的多线程数据使用方案要求不同线程处理不同的数据,即多个线程不能共享临界区。
例如:有10张车票供2个顾客预定,而又要求2个顾客尽可能多地预定10张车票,这10张车票作为共享资源,可能导致1张票预定给2个顾客的情况,针对这种情况,设计时应采用正确的同步机制。
若2个线程同步执行时需要相互打开,就会出现1个线程依赖于另1个要打开的线程而形成死锁。
它不是资源不够引起的,而是由线程的调度引起的。
对于
死锁可用下述方法解决:
(1)尝试在尽可能短的时间内执行锁定的代码,占用时间越长,另一线程出现和需要对象的可能性越大。
(2)当我们从另一个被同步的方法中激活被同步的方法时要小心,最好是清楚地定义每个线程的任务,并考虑使用什么数据和什么时候使用。
总之,在多线程程序设计中,要充分考虑各种可能出现的情况,并用适当的方法给予解决,使线程在运行过程中按所预期定义的目标进行。
Http协议简介
HTTP是Web协议集中的重要协议,它是从客户机/服务器模型发展起来的。
客户机/服务器是运行一对相互通信的程序,客户与服务器连接时,首先,向服务器提出请求,服务器根据客户的请求,完成处理并给出响应。
浏览器就是与Web服务器产生连接的客户端程序,它的端口为TCP的80端口。
举一个大家都很常见的例子,浏览器与Web服务器之间所遵循的协议就是HTTP。
Web的应用层协议HTTP是Web的核心。
HTTP在Web的客户程序和服务器程序中得以实现。
运行在不同端系统上的客户程序和服务器程序通过交换HTTP消息彼此交流。
HTTP定义这些消息的结构以及客户和服务器如何交换这些消息。
HTTP定义Web客户(即浏览器)如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户。
断点续传原理
其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。
打个比方,浏览器请求服务器上的一个文件时,所发出的请求如下:
,。
GET / HTTP/
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/
excel, application/msword, application/, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/ (compatible; MSIE ; Windows NT )
Connection: Keep-Alive
服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:
200
Content-Length=106786028
Accept-Ranges=bytes
Date=Mon, 30 Apr 2001 12:56:11 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/
Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT
所谓断点续传,也就是要从文件已经下载的地方开始继续下载。
所以在客户端浏览器传给Web服务器的时候要多加一条信息----从哪里开始。
下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。
GET / HTTP/
User-Agent: NetFox
RANGE: bytes=2000070-
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
仔细看一下就会发现多了一行RANGE: bytes=2000070-,,前面的字节不用传了。
服务器收到这个请求以后,返回的信息如下:
206
Content-Length=106786028
Content-Range=bytes 2000070-106786027/106786028
Date=Mon, 30 Apr 2001 12:55:20 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT
和前面服务器返回的信息比较一下,就会发现增加了一行:Content-Range=bytes 2000070-106786027/106786028
返回的代码也改为206了,而不再是200了。
知道了以上原理,就可以进行断点续传的编程了。
3 需求分析
随着Internet的发展,进入信息时代后快速获得网络共享资源成为很简单的事情,人们对互联网也有了很大的依赖性。
人们甚至希望只轻松点击鼠标就可以
得到自己想要的东西。
比如,针对一些专业的论坛提供了很多相关资料以方便人们阅读或了解;还有更多的人希望能过下载到他们喜欢听得音乐、好看的图片、喜欢的电影等等。
也可以看出人们在上网时再也不单是打开浏览器来浏览网页,越来越多的人们开始使用下载软件来获取资源。
同时人们也更希望使用更新更快的下载软件。
由于用户下载需求的增大,也要求下载软件能够迅速完成对资源的下载。
多线程程序设计可以很好的解决程序并发的问题。
最恰当的比喻就是用户会感到CPU似乎同时出现在两个地方,在下载软件中应用多线程技术可以理解为将一个下载任务分成若干份来完成,其中的并发控制将使下载的效率大大提高。
由于下载资源是一个过程,当中用到的时间可能会很长。
那么在很长的这段时间中很有可能会出现很多的意外情况使下载中断或是停止,比如电源意外被切断、网络中断、或是操作系统故障导致系统重新启动。
这些原因都会导致下载的中断,但是当用户重新下载资源时发现原来下载的数据已经消失你还是要回头再来。
断点续传就是用来解决这样的问题的,它的任务是在下载任务停止时,记录当前下载的信息并且利用网络协议中的一些重定向机制继续完成下载任务而不必从头再来。
随着使用下载工具的时间的增长,用户下载的资源越来越多,因此在下载列表中的项目也越来越多,越来越混乱,因此为了便于管理和用户使用方便,用户迫切希望下载工具具有下载文件分类的功能。
在下载任务的管理这一块,用户不仅希望下载工具具有下载一个一个资源的功能,而且具有批量下载有些相似的或有关联的资源的功能。
还有些特殊情况下,用户在下载任务开始后由于种种原因希望放弃资源的下载,这就要求下载工具具有删除任务的功能了。
为了对下载任务进行掌控,用户往往具有设置下载任务的线程数,文件下载网址,文件下载存储目录和在下载过程中对下载任务的状态进行监控等功能需求。
鉴于某些软件使用初学者甚至某些电脑初学者的实际情况,他们往往需要系统有一个格外的帮助文档,使他们能够更快、更好地学会使用断点续传下载软件,提高效率。
业务流分析
多线程断点续传的业务流程:首先由用户进入软件系统,在新建任务中填写必要的下载资源的相关属性,比如相关资源下载地址URL、存储路径、以及下载线程数等。
由软件发送HTTP消息请求,然后服务器根据请求返回响应消息。
确认无误就可以启动线程开始下载资源。
将缓存中存储的数据最终存储到目的存
储路径。
此外,系统为用户提供了一些对任务的基本操作,比如,停止、继续、删除等。
4. 系统设计
系统设计要点
随着用户下载需求的增大,用户下载的资源越来越大,下载的过程也就越来越久,这就要求下载软件能够迅速完成对资源的下载,为了提高下载效率的问题,所以本系统采用多线程的方式来实现下载速率的提高。
多线程的优点之一是所有线程都可以访问相同的全局变量和共享资源,它提供了程序设计的简捷性与便利性,提高了对信息处理的并发度,但也带来了数据的讹误或线程得不到某一资源而被饿死(即死锁)的可能性。
为了避免这些现象的产生,线程在使用共享资源或对象前必须获得一个约束访问同步对象的权力,也就是通过同步的机制来控制这种权力的使用,这就是线程的安全问题。
Http协议是互联网中一个非常重要而且应用十分频繁的协议,所以本系统的设计是基于Http协议的。
长期以来,断点续传始终是困扰网虫们的一大难题,眼看着已经下载到99%的软件,却由于突然掉线而前功尽弃的那种沮丧恐怕人人都经历过,于是本系统采用断点续传的方式来设计。
本系统设计的基本目标就是利用编写一个时下流行的基于Http协议的多线程断点续传的程序来研究Java多线程与线程安全的机制。
系统总体功能结构
通过对多线程断点续传下载软件的需求分析并结合实际情况的分析,本系统由下载分类管理、任务管理、设置管理、系统帮助四个主模块构成。
本系统的功能结构图如图示:
其中下载文件的分类模块主要是通过在新建下载任务时候设置下载文件的存储目录甚至新建一个存储目录的方式来实现。
下载任务的管理模块主要有三个子模块组成:新建下载任务模块、批量完成下载任务模块、删除任务模块。
在设置任务的管理模块主要有两个子模块组成:在新建(批量)下载任务的时候进行任务的连接方面的配置模块以及在现在过程中对下载任务的状态进行监视的模块。
在系统帮助模块里主要是包含一些对整个系统的说明,便于用户理解。
另外系统还支持将资源下载URL地址自动添加到剪贴板中,这样用户只需要点击地址即可开始下载,而不是需要手动粘贴、复制URL地址到指定位置。
图1下载程序功能结构图
本下载程序提供两种操作模式:一种是使用命令行参数对下载软件进行操作;另一种方式是通过图形界面对下载软件进行操作。
在此对图形界面的实现进行详细介绍。
下载程序的主界面设计使用Eclipse开发主要分成四部分:第一部分是菜单栏,提供功能选项;第二部分是标准按钮栏;第三部分是信息列表框,其中包括下载软件的名称、大小、下载进度、下载速度、剩余时间等下载任务的属性;最后一部分是一个文本框用来监视下载文件时返回的信息,包括下载文件的URL 地址、下载文件的长度、以及完成任务的所有线程数和每个线程完成的块大小。
在下载过程中上边提到的相关信息都会显示在列表框和文本框中,用户可以方便地监视到下载文件的状况。
,JFace中引用了action的概念主要用完成用户动作的代码复用。
在这里每一个action都可以用来响应一个用户的动作,比如打印文件、打开文档或是显示对话框。
程序的主界面菜单栏的设计就是对action的复用。
首先创建用户动作,包括新建下载任务动作(newTaskAction)、新建批量下载任务动作(batchTaskAction)、删除任务动作(deleteTaskAction)、帮助动作(aboutAction)和退出动作
(exitAction),这些都是action。
在主界面GUI中代码设计如下。
添加用户动作。
添加新建下载任务动作:
public class NewTaskAction extends Action {
public NewTaskAction() {
super("新建任务@Ctrl+N",
(,"icons/" ));
setToolTipText("新建任务");
}
}
添加新建批量下载任务动作:
public class BatchTaskAction extends Action {
public BatchTaskAction() {
super("新建批量任务
@Ctrl+B",(,
"icons/" ));
setToolTipText("新建批量任务");
}
}
添加删除任务动作:
public class DeleteTaskAction extends Action {
public DeleteTaskAction() {
super("删除下载任务@Delete",
(,
"icons/" ));
setToolTipText("删除下载任务");
}
}
添加退出动作:
public class ExitAction extends Action {
public ExitAction() {
super("退出@Alt+F4");
setToolTipText("退出");
}
}
在界面菜单中创造用户动作的实例,并将这些实例添加到菜单栏的菜单项当中。
public class GUIDownloader extends ApplicationWindow {
public static GUIDownloader APP;
newTaskAction = new NewTaskAction();
batchTaskAction = new BatchTaskAction();
exitAction = new ExitAction();
aboutAction = new AboutAction();
deleteTaskAction = new DeleteTaskAction();
protected MenuManager createMenuManager() {
MenuManager menuManager = new MenuManager();
MenuManager fileMenu = new MenuManager("文件(&F)");
(fileMenu);
(newTaskAction);
(batchTaskAction);
(deleteTaskAction);
(new Separator());
(exitAction);
}
使用这样的方法就完成了上述用户动作,只要点击菜单栏按钮同样完成相应事件的动作,比如按下新建下载任务后可以弹出新建下载任务对话框。
标准按钮栏和菜单栏的添加方法和菜单栏很相似,只需要添加按钮后同样添加用户动作即可。
用户界面除了按钮部分还包括下载时显示下载任务诸多属性的表格(Table),和监视下载信息的列表框(List)。
在Table与List的设计中主要采用分割条(SashForm)对Table和List进行分隔。
使用SashForm的好处就是可以使用户界面显得更标准、更美观;而且SashForm的功能是可以拉伸,从而调整Table与List之间的比例最终达到用户满意的效果;操作非常方便。
设计Table、List与SashForm的主要代码:
private Table tasksTable;
private List taskLogger;
public Table getTasksTable() {
return tasksTable;
}
public List getTaskLogger() {
return taskLogger;
}
protected Control createContents(Composite parent) {
SashForm pane = new SashForm(parent, );
tasksTable = new Table(pane, | );
for (int i = 0, n = ; i < n; i++) {
TableColumn col = new TableColumn(tasksTable, );
(COLUMNTEXTS[i]);
(COLUMNWIDTHS[i]);
}
(true);
(true);
}
用户主界面如图2所示:
图2 下载软件的主界面
下载任务实现
下载任务类图
多线程下载程序是通过网络协议支持进行资源的下载,在这里对建立下载任务(Task)添加抽象方法start、stop、resume来建立任务。
由支持HTTP协议下载(HTTPTask)继承Task的抽象方法并实现通过HTTP协议下载。
这样做的好处就是软件会有很好的扩展性,通过对Task的继承还可以产生支持不同协议的下载,比如FTP下载、BT下载、EDonkey下载等等。
下载任务类图如下:
图3 下载任务类图
下载任务顺序图
下载任务根据用户需求新建任务,在新建任务中填写必要的下载资源的相关属性,比如相关资源下载地址URL、存储路径、以及下载线程数等。
由软件发送HTTP消息请求,然后服务器根据请求返回响应消息。
确认无误就可以启动线程开始下载资源。
将缓存中存储的数据最终存储到目的存储路径。
下载任务顺序图如图4所示:
图4下载任务顺序图
下载任务管理主要的是对下载任务进行的一系列操作,包括新建下载任务、批量下载任务、删除任务、清除文件的一些操作。
新建下载任务是是根据用户下载需求来创建下载任务的功能,用户需要提供下载资源的URL地址、选择存储文件的路径、用户希望下载时的线程数、以及存储时的文件名称。
下载软件会根据新建任务栏的信息完成下载任务并且进行监控。
其中选择存储文件的路径可以通过单击浏览按钮来选择存储文件夹。
批量下载的原理和下载任务的原理和相似,只是同时进行多个下载任务。
删除任务和清除文件就是对任务和以下载的文件。
下载任务具体实现
下载任务管理主要是对下载任务进行操作,下载任务中主要包括新建下载任务、批量下载任务、退出任务。
任务管理的结构图如图5所示:
图5下载任务结构图
新建下载任务设计使用SWT/JFace中的对话框(Dialog)设计实现,新建下载任务流程图,如图6所示:
图6新建下载任务流程图
新建下载任务对话框的设计主要是根据JFace中Dialog设计实现,如图7所。