java 下载加速_一种基于Java的大文件下载加速方法与流程
本发明涉及java/多线程技术领域,涉及一种加速文件下载装置,具体提供一种基于java的大文件下载加速方法。
背景技术:
现有的常用下载方式是基于浏览器的单线程下载。这种单线程下载的方式,是通过http传输协议请求下载。一般而言,把需要下载的文件放在服务器的某个路径下,或者服务端通过数据库拼接文件,当客户端请求服务器进行下载的时候,服务端通过对应路径或者数据库拼接文件返回给客户端文件字节流。客户端进行格式整理,然后弹出下载窗口,浏览器自带的下载引擎进行下载。
基于浏览器的单线程下载,或者说是计算整个文件的比特流下载,在一定程度上是简洁可靠的。这样下载的好处是能有效的保证可靠性。但同时,在某些情况下,因为网速的限制加上某些站点的限流政策,下载一个大文件往往是很困难的,因为文件容量太大,无论是传输字节流或者单线程的浏览器下载,对下载速度都会有很大的影响。
技术实现要素:
本发明为了解决下载速度过慢的问题,提供一种基于java的大文件下载加速方法,基于java多线程技术,采用线程池技术,和juc包中的forkjoinpool,均衡cpu的负载,把一个大文件使用分而治之,分割成多个小文件进行下载,下载完成之后在重新合并成一个大文件。
为实现上述目的,本发明提供了如下技术方案:
一种基于java的大文件下载加速方法,所述方法基于java多线程技术,采用线程池技术,利用juc包中的forkjoinpool,均衡cpu的负载,把一个大文件分割成多个小文件进行下载,下载完成之后再重新合并成一个大文件。
java5.0提供了java.util.concurrent(简称juc)包,在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,包括线程池,异步io和轻量级任务框架;还提供了设计用于多线程上下文中的collection实现等。
所述方法的实现包括进程如下:
1)连接请求进程:连接远程http,获取相关参数,保证稳定的http请求连接;
2)文件处理进程:进行文件切割,文件合并等操作;
3)任务进程:把文件处理成java可执行的任务;
4)下载进程:进行下载管理;
5)汇报进程:汇报内存和下载进度情况。
所述方法实现步骤包括:
1)指定下载文件;
2)创建线程池;
3)分割任务;
4)提交分割后的任务到线程池;
5)使用forkjoinpool搭建框架图;
6)监控下载进度;
7)监控内存使用情况。
所述线程池的核心线程数为jvm可用的处理器数量的2倍,保证cpu负载均衡。因为下载文件是io密集型文件,所以根据线程池的设计经验,设计线程池的核心线程数为处理器数量*2。
jvm是javavirtualmachine(java虚拟机)的缩写,jvm是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
java语言的一个非常重要的特点就是与平台的无关性。而使用java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入java语言虚拟机后,java语言在不同平台上运行时不需要重新编译。java语言使用java虚拟机屏蔽了与具体平台相关的信息,使得java语言编译程序只需生成在java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是java的能够"一次编译,到处运行"的原因。
所述方法通过使用java的juc包中的构造器创建线程池。具体的代码如下:
executorserviceexecutorpool=newthreadpoolexecutor(8,8,60,
timeunit.seconds,newlinkedblockingqueue(20){},
(runnable)->newthread(runnable,"mythread"),newthreadpoolexecutor.discardpolicy());
所述方法中分割任务的实现包括内容如下:计算文件的总大小,然后除以处理器数量n,按byte流分割成n个小任务,把每个小任务通过sumit()方法提交到线程池。
所述方法使用forkjoinpool框架采用递归的方式,分割执行每个小任务,然后使用合并(merge)的方式把任务结合起来。
递归做为一种算法在程序设计语言中广泛应用。是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。
所述方法通过综合每个子任务的下载的进度,汇报总下载进度。
所述方法通过使用java自带工具jconsole监控进程使用内存大小。
所述方法实现系统包括系统模块如下:
1)连接请求系统;
2)文件处理系统;
3)任务系统;
4)下载系统;
5)汇报系统。
与现有技术相比,本发明一种基于java的大文件下载加速方法具有以下突出的有益效果:
1.通过jvm可用的处理器个数,保证cpu负载均衡;
2.通过线程池做线程管理,保证了线程有效的执行;
3.具有查看下载进度,监控内存的功能。
附图说明
图1是本发明方法实现流程图;
图2为分割任务流程图;
图3为forkjoinpool架构图;
图4为本发明实现系统模块图。
具体实施方式
下面将结合附图和实施例,对本发明作进一步详细说明。
实施例
一种基于java的大文件下载加速方法,所述方法基于java多线程技术,采用线程池技术,利用juc包中的forkjoinpool,均衡cpu的负载,把一个大文件分割成多个小文件进行下载,下载完成之后再重新合并成一个大文件。
所述方法的实现包括进程如下:
1)连接请求进程:连接远程http,获取相关参数,保证稳定的http请求连接;
2)文件处理进程:进行文件切割,文件合并等操作;
3)任务进程:把文件处理成java可执行的任务;
4)下载进程:进行下载管理;
5)汇报进程:汇报内存和下载进度情况。
如图1所示,所述方法实现步骤包括:
1)指定下载文件;
2)创建线程池;
3)分割任务;
4)提交分割后的任务到线程池;
5)使用forkjoinpool搭建框架图;
6)监控下载进度;
7)监控内存使用情况。
所述线程池的核心线程数为jvm可用的处理器数量的2倍,保证cpu负载均衡。因为下载文件是io密集型文件,所以根据线程池的设计经验,设计线程池的核心线程数为处理器数量*2。
所述方法通过使用java的juc包中的构造器创建线程池。具体的代码如下:
executorserviceexecutorpool=newthreadpoolexecutor(8,8,60,
timeunit.seconds,newlinkedblockingqueue(20){},
(runnable)->newthread(runnable,"mythread"),newthreadpoolexecutor.discardpolicy());
如图2所示,所述方法中分割任务的实现包括内容如下:计算文件的总大小,然后除以处理器数量n,按byte流分割成n个小任务,把每个小任务通过sumit()方法提交到线程池。
所述方法使用forkjoinpool框架采用递归的方式,分割执行每个小任务,然后使用合并(merge)的方式把任务结合起来。递归做为一种算法在程序设计语言中广泛应用。是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。
如图3所示,为forkjoinpool架构图,其中:
executor运行;
executorserviceexecutorservice是java提供的线程池,也就是说,每次我们需要使用线程的时候,可以通过executorservice获得线程;
scheduledexecutorservice延迟/周期执行线程池,主要作用就是可以将定时任务与线程池功能结合使用;
scheduledthreadpoolexecutor用来在给定延时后执行异步任务或者周期性执行任务,相对于任务调度的timer来说,其功能更加强大,timer只能使用一个后台线程执行任务,而scheduledthreadpoolexecutor则可以通过构造函数来指定后台线程的个数;
threadpoolexecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务;
forkjoinpool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来即可。
所述方法通过综合每个子任务的下载的进度,汇报总下载进度。
所述方法通过使用java自带工具jconsole监控进程使用内存大小。
如图4所示,所述方法实现系统包括系统模块如下:
1)连接请求系统;
2)文件处理系统;
3)任务系统;
4)下载系统;
5)汇报系统。
以上所述的实施例,只是本发明较优选的具体实施方式,本领域的技术人员在本发明技术方案范围内进行的通常变化和替换都应包含在本发明的保护范围内。
java 下载加速_一种基于Java的大文件下载加速方法与流程相关推荐
- java 基于类路径搜索_一种基于ClassLoader的自定义类查找方法与流程
本发明涉及IT技术领域,特别是指一种基于ClassLoader的自定义类查找方法. 背景技术: 随着信息系统的复杂性日益增大,使用反射机制设计的系统越来越多.根据不同的业务需要通过反射去获得相应的处理 ...
- 服务器基线加固脚本_一种基于WebLogic的安全基线加固方法与流程
本发明涉及一种安全基线加固方法,尤其涉及一种基于weblogic的安全基线加固方法. 背景技术: weblogic是一个基于javaee架构的中间件,用于开发.集成.部署和管理大型分布式web应用.网 ...
- unity 陶瓷质感_一种基于Unity3D的虚拟陶瓷设计方法与流程
本发明涉及虚拟现实领域,特别涉及一种基于Unity3D的虚拟陶瓷设计方法. 背景技术: 陶艺工艺制作环境要求严格:不仅在拉坯成型需要利用旋转机器,在烧制过程则需要窑炉锻造,如何将陶瓷制作工艺与虚拟现实 ...
- dncnn图像去噪_一种基于DnCNNs改进的图像降噪方法与流程
本发明涉及图像处理技术领域,具体涉及一种基于dncnns改进的图像降噪方法. 背景技术: 随着科技进步,新的图像技术在逐渐推广,在日常生活中人们对于图像的要求也越来越高,针对阴天或夜晚等弱光条件下拍摄 ...
- 疲劳驾驶监测方案_一种基于手机的疲劳驾驶监测方法与流程
本发明属于安全驾驶领域,具体涉及一种基于手机的疲劳驾驶监测方法. 背景技术: 疲劳驾驶是指驾驶员在长时间连续行车后,产生生理机能和心理机能的失调,从而在客观上出现的驾驶技能和反应下降的现象.若驾驶员在 ...
- 手机室内地磁定位软件_一种基于地磁的智能手机实时定位方法与流程
本发明涉及室内地磁定位导航方法,具体涉及一种基于地磁的智能手机实时定位方法,属于移动计算和室内定位技术领域. 背景技术: 随着室内定位导航的日益需求,利用地磁信息作为位置指纹的室内定位导航技术显示出其 ...
- fft 估计载波频率程序_一种基于扫描精确估计载波频率的方法与流程
本发明涉及信号处理技术领域,特别涉及一种基于扫描精确估计载波频率的方法. 背景技术: 信号的载波频率估计是通信.雷达.声纳以及电子对抗等领域信号处理中的一个重要问题.基于参数模型的谱估计.最大熵谱估计 ...
- 双目视觉焦距_一种基于可变焦相机的双目视觉测距方法与流程
本发明属于双目视觉技术领域,具体涉及一种基于可变焦相机的双目视觉测距方法. 背景技术: 在这个计算机视觉技术发展迅速的时代,获取深度信息成为了一个热门的课题,因其所诞生的方法也各式各样,但是绝大部分的 ...
- rssi室内定位算法原理_一种基于RSSI测距的室内定位方法与流程
本发明涉及室内定位领域,尤其涉及一种基于RSSI测距的室内定位方法. 背景技术: : 室内无线定位,是指利用无线网络和定位终端提供待测节点位置.速度和方向等相关信息的服务.对于一个定位算法而言,评价其 ...
最新文章
- 全国大学生智能汽车竞赛-讯飞赛道线下赛开始报名啦!
- 用管控策略设定多账号组织全局访问边界
- 和谐 平等_平等还是认同?
- 【华为云技术分享】一文掌握5种常用的机器学习模型及其优缺点
- centos安装mysql初始化没有密码_centos 6 初次安装mysql 的密码初始化登陆问题
- vscode remote 第三方库_还能这么玩?用VsCode画类图、流程图、时序图、...不要太爽
- bzoj 3798: 特殊的质数(分块打表)
- python 日期减一天_怎么用Python在指定日期上减去7天?
- 《python核心编程》笔记——系统限制
- 学生计算机如何用数字小游戏,【数学思维】小学生数学趣味游戏:你身上的计算器...
- mysql 敏感词_过滤敏感词方式
- 2021中国科学院文献情报中心期刊分区表 计算机(2)
- 全网最全C盘清理攻略
- 外汇天眼:美国10年期国债收益率创下2011年以来新高
- docer启动一个容器时的过程
- 车载以太网第二弹-实锤|SOME/IP概述及TC8 SOME/IP 测试实践
- 背景颜色渐变(shape属性)
- 实现开关操作的C语言程序
- java foreach标签_Java中Velocity foreach循环标签详解
- mac上的PCB设计软件现状
热门文章
- Wnt 信号通路介导胆碱通路抵御感染
- 吃鸡连点器哪款好用实惠?百收小编给你推荐吧
- 二维码生成并上传至七牛云 返回图片URL
- 发票丢失了该怎么处理......
- 笔下文学小说下载【3.01】
- 云大计算机831参考资料,云南大学2016年考研英语语言文学专业考研初试复试经验分享-CallmeSpell...
- 虚拟机怎么安装gho系统
- 微信小程序高度设置为100%
- 安卓微信浏览器返回上一页默认读取缓存解决方案
- 1038 一元三次方程求解 2001年NOIP全国联赛提高组