快速业务通道

用java多线程断点续传实践 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

用java多线程断点续传实践

时间:2010-12-22 BlogJava bitmap

annegu做了一个简单的Http多线程的下载程序,来讨论一下多线程并发下载 以及断点续传的问题。

这个程序的功能,就是可以分多个线程从目标地址上下载数据,每个线程负 责下载一部分,并可以支持断点续传和超时重连。

下载的方法是download(),它接收两个参数,分别是要下载的页面的url和编 码方式。在这个负责下载的方法中,主要分了三个步骤。第一步是用来设置断点 续传时候的一些信息的,第二步就是主要的分多线程来下载了,最后是数据的合 并。

1、多线程下载:

/** *//** http://www.bt285.cn http://www.5a520.cn */ public String download(String urlStr, String charset) {      this.charset = charset;      long contentLength = 0;          CountDownLatch latch = new CountDownLatch (threadNum);      long[] startPos = new long[threadNum];      long endPos = 0;      try {          // 从url中获得下载的文件格式与名字          this.fileName = urlStr.substring (urlStr.lastIndexOf("/") + 1);          this.url = new URL(urlStr);          URLConnection con = url.openConnection();          setHeader(con);          // 得到content的长度          contentLength = con.getContentLength();          // 把context分为threadNum段的话,每段的长度。          this.threadLength = contentLength /  threadNum;          // 第一步,分析已下载的临时文件,设置断点,如果是 新的下载任务,则建立目标文件。在第4点中说明。          startPos = setThreadBreakpoint(fileDir,  fileName, contentLength, startPos);          //第二步,分多个线程下载文件          ExecutorService exec =  Executors.newCachedThreadPool();          for (int i = 0; i < threadNum; i++)  {              // 创建子线程来负责下载数据,每段数据的起 始位置为(threadLength * i + 已下载长度)              startPos[i] += threadLength *  i;              /**//*设置子线程的终止位置,非最后一个线程 即为(threadLength * (i + 1) - 1)              最后一个线程的终止位置即为下载内容的长度 */              if (i == threadNum - 1) {                  endPos = contentLength;              } else {                  endPos = threadLength * (i +  1) - 1;              }              // 开启子线程,并执行。              ChildThread thread = new ChildThread (this, latch, i, startPos[i], endPos);              childThreads[i] = thread;              exec.execute(thread);          }          try {              // 等待CountdownLatch信号为0,表示所有子线 程都结束。                  latch.await();              exec.shutdown();              // 第三步,把分段下载下来的临时文件中的内 容写入目标文件中。在第3点中说明。            

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号