探讨Java多线程下载技术
2019-10-31韩晓艳袁堂青
韩晓艳 袁堂青
摘要:近些年,国内的科技有了长远的发展,在我们的日常生活中,计算机也实现了普及,对我们的生产生活影响也越来越大。目前,多线程下载技术作为目前应用非常高的下载方案,将多线程的优势充分发挥了出来。通过多线程,相同时间的下载请求,可以对下载数据进行分割处理,各线程对应不同的下载内容,在最后组成文件,这样就能够有效提高下载的效率。现阶段,很多下载软件都应用了多线程下载技术。基于这一情况,该文就Java多线程下载技术开展分析研究。
关键词:Java;多线程技术;线程安全;计算机
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2019)22-0071-02
开放科学(资源服务)标识码(OSID):
近些年我国经济实现了跳跃式的发展,人们的生活水平有了很大的提高,计算机网络也已经得到了普及。目前,人们下载网络资源是获取信息最主要的一种途径。在获取网络资源的过程中,最重要的就是下载技术,而一个线程可以看作一个下载通道,多个线程就可以对应多个下载通道。在相同环境下,如果有了多线程技术,那么下载速度就会有一定程度的提高。在目前多种下载软件中,都应用了多线程下载技术,具有非常大的优势。
1 线程的基本概念及其优劣
1.1 线程的基本概念
计算机中正在执行的程序,被称为“进程”,相对于程序来说,进程是一个动态的概念,是程序的一次执行过程。线程相比较进程来说,属于更小的运行单位,一个进程涵盖了很多个线程,同样能够为用户处理更多的问题。比如,IE浏览器在同时下载图片的时候,还可以为用户提供已经完成下载的页面,这也是比较典型的例子。
各进程之间是相互独立的,彼此之间对其他线程是否存在不需要考虑。在一个任务中,线程属于区中的一个执行代码,不同的线程之间可能会有一定的影响彼此存在一定的联系,多个线程对资源进行共享。
1.2 多线程技术的优缺点
多线程技术不但可以提高交互式,而且能够更加高效、便捷地进行控制。在对多线程应用的时候,可以使程序响应速度得到提高,从而实现速度化、高效化的特点。另外,多线程技术存在的缺点也比较明显,需要等待比较长的时间之外,还会在一定程度上使程序运行速度降低,使工作效率受到一定的影响,从而对资源造成了浪费。
2 下载技术框架
2.1 网络下载技术
现阶段,我国的网络覆盖面积正在快速地扩大,使用网络的人员也越来越多,据相关统计显示,截至2017年,我国网民规模超过7亿,全年共计新增网民4000多万人。互联网普及率超过了55.0%。越来越多的使用者,都需要通过Wed服务器实现访问操作,这就致使网络下载速度受到Wed服务器性能的制约。基于这一情况,P2P技术就凭借自身的优势,广泛应用到了共享文件方面,主要特征包括:资源分散化、负载相对均衡化以及非中心化,能夠基于客户机结点保存共享文件。在中央服务器缺少时,用户也可以进行共享、传送文件的操作。PZP技术利用多数结点传输数据和合作下载的方式,最大限度地改善文件传输的效率。
2.2 下载的基本构架
目前网络下载的基本架构是P2P、C/S架构。P2P网络结构发展出多源文件传输途径,主要应用有e Mule和BT;C/S架构即客户端/服务器架构,由此发展出的TP下载,是在客户端应用多线程下载模式。传统的HTTP/FTP下载属于C/S框架的一种,这一模式下的服务器需要存储海量的共享文件,用于文件的共享、下载以及搜索。但是也意味着大量客户端的数据访问都要经过服务器这一瓶颈。BT协议的基础结构为P2P,即Peer to Peer。P2P可以利用每个节点的资源,构建自组网络,网络结点之间的关系属于对等的,实现了不需要通过服务器就可以传送文件。
3 Java语言的线程模型
Java语言的特点是从最底层开始支持线程,标准的Java类允许在一个给定的应用程序中有多个线程调用同一方法,而线程彼此之间互不干扰,Java语言的这些特点为多线程应用程序的设计奠定了基础。在Java中是由java.lang.Thread类进行定义和描述的。程序中的线程都是Thread类的实例。因此用户可以通过创建Thread的实例或定义并创建Thread子类的实例建立和控制自己的线程。
当一个Java程序运行时,至少会生成一个线程,该线程由main()方法开始的,不同的线程是无法自动启动的,必须通过其他线程来调用。一个线程, 同进程一样,也有从创建、运行到消亡的过程,因此每个线程都具有创建、就绪、运行、死亡四种状态。
Java语言是目前最为流行的编程语言,有非常广泛的应用。Java语言的多线程编程技术可以充分利用到下载程序中,对下载任务进行分割,从而实现多项任务并发运行。
4 Java线程的基本结构与使用方法
4.1 线程的创建、启动
Java语言线程的创建有两种方法:
第一种方法是通过继承Thread类,即将一个类声明为Thread类的子类,重写run()方法:
Class ThreadExam extends Thread {public void run(){}}
第二种方法是实现Runnable接口创建线程:
Thread t1 = new Thread(new Runnable(){public void run(){}})
新建的线程不会自动运行,必须调用线程的start()方式执行。该方法的调用把嵌入在线程中的虚拟CPU置为可运行状态,意味着它可以被调度运行,但这并不意味着线程会立即运行。建议在创建线程的时候,使用实现Runnable接口的方式更加灵活。
4.2 多线程下载算法
tP= q(ts+tt) (1)
在公式(1)中,tP代表的是锁外消耗时长,其占比重为q;ts为锁内消耗时长,tt为解及加锁消耗时长。如果q是整数的时候,就代表第一次申请才会形成锁竞争;如果q是小数的时候,就会产生重复锁竞争。下面公式(2)、(3)、(4)运算公式为运算的并行下载时间:
若q≤h-1,则t(n)=(n+q)(ts+tt) (2)
若q>h-1,则t(n)=(k(q-h+1)+b+q)(ts+tt) (3)
在上面的公式中,N代表的是文件块数目,h代表的是线程数目,k表示的是[nh]比值,p表示的是机器处理核数,fk=ts/tt表示的是锁粒度。
4.3 线程同步
那些需要共享对象和数据的多个线程,必须互相了解对方的状态以及活动。不同的线程在同一时间内不能存取同一数据,否则程序就可能出错。因此,对于这些并发执行却又共享数据的线程,必须采取某些方法对它们进行同步管理。
在Java中,想要实现线程同步,需要基于synchronized关键词,在利用该方法使用线程之前,其资源是独享的状态,其他的线程都处在阻塞的情况。如果这一方法执行完成后,其他的线程才能够使用这一方法。如果只是单纯同步某一段代碼,可以采用synchronized的方式。同步程序发生异常情况的时候,就会发生饥饿或是死锁的情况。
5 结束语
综上所述,目前,我们在日常生产生活中比较常用的一种下载方案为多线程下载技术,该技术具有非常显著的多线程优势,可以利用多个线程同时进行下载,每一个线程只负责下载其中一部分,大大提升了下载效率。但是并不是线程越多性能越好,当线程超过一定数量时,线程的调度的开销会很大,反而会让性能降低,因此要适当使用多线程,不能滥用。合理利用java断点续传功能,例如突然电脑关机了,当再开机时已经下载到一半的文件不需要重新开始,而是接着刚才的位置继续下载,既可以节省网络流量和节省用户时间,又给用户良好的使用体验。
参考文献:
[1] 耿永利.基于Java的网络管理系统开发与管理[J].漯河职业技术学院学报,2015(2):34-35.
[2] 姚斌.基于JAVA的多线程下载器的设计[J].信息与电脑:理论版,2014(7):28-29.
[3] 刘引涛.基于Java的多线程下载工具研究与实现[J].现代电子技术,2012(8):11-14.
[4] 晏春海,田蔚风,王俊璞,等.多线程技术在分时串口通信中的应用[J].仪表技术与传感器,2004(5).
[5] 任双君,周旭,任勇毛,等.基于HTML5的浏览器端多线程下载技术[J].计算机系统应用,2017(11).
[6] 阚能琪.VC++串口通信中多线程技术的应用研究[J].西华大学学报:自然科学版,2005(4).
【通联编辑:唐一东】