多线程—断点续传

多线程—断点续传

ID:37669517

大小:145.00 KB

页数:17页

时间:2019-05-28

多线程—断点续传_第1页
多线程—断点续传_第2页
多线程—断点续传_第3页
多线程—断点续传_第4页
多线程—断点续传_第5页
资源描述:

《多线程—断点续传》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、annegu做了一个简单的Http多线程的下载程序,来讨论一下多线程并发下载以及断点续传的问题。这个程序的功能,就是可以分多个线程从目标地址上下载数据,每个线程负责下载一部分,并可以支持断点续传和超时重连。下载的方法是download(),它接收两个参数,分别是要下载的页面的url和编码方式。在这个负责下载的方法中,主要分了三个步骤。第一步是用来设置断点续传时候的一些信息的,第二步就是主要的分多线程来下载了,最后是数据的合并。1、多线程下载:Java代码1.    public String downl

2、oad(String urlStr, String charset) {  2.        this.charset = charset;  3.        long contentLength = 0;  4.①       CountDownLatch latch = new CountDownLatch(threadNum);  5.        long[] startPos = new long[threadNum];  6.        long endPos = 0;  7. 

3、 8.        try {  9.            // 从url中获得下载的文件格式与名字  10.            this.fileName = urlStr.substring(urlStr.lastIndexOf("/") + 1, urlStr.lastIndexOf("?")>0 ? urlStr.lastIndexOf("?") : urlStr.length());  11.            if("".equalsIgnoreCase(this.fileNam

4、e)){  12.                this.fileName = UUID.randomUUID().toString();  13.            }  14.  15.            this.url = new URL(urlStr);  16.            URLConnection con = url.openConnection();  17.            setHeader(con);  1.            // 得到conten

5、t的长度  2.            contentLength = con.getContentLength();  3.            // 把context分为threadNum段的话,每段的长度。  4.            this.threadLength = contentLength / threadNum;  5.              6.            // 第一步,分析已下载的临时文件,设置断点,如果是新的下载任务,则建立目标文件。在第4点中说明。  7.

6、            startPos = setThreadBreakpoint(fileDir, fileName, contentLength, startPos);  8.  9.            //第二步,分多个线程下载文件  10.            ExecutorService exec = Executors.newCachedThreadPool();  11.            for (int i = 0; i < threadNum; i++) {  12. 

7、               // 创建子线程来负责下载数据,每段数据的起始位置为(threadLength * i + 已下载长度)  13.                startPos[i] += threadLength * i;  14.  15.                /*设置子线程的终止位置,非最后一个线程即为(threadLength * (i + 1) - 1) 16.                最后一个线程的终止位置即为下载内容的长度*/  17.           

8、     if (i == threadNum - 1) {  18.                    endPos = contentLength;  19.                } else {  20.                    endPos = threadLength * (i + 1) - 1;  21.                }  22.                // 开启子线程,并执

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。