WEB开发网
开发学院软件开发Java 用java多线程断点续传实践 阅读

用java多线程断点续传实践

 2009-09-24 00:00:00 来源:WEB开发网   
核心提示:annegu做了一个简单的Http多线程的下载程序,来讨论一下多线程并发下载以及断点续传的问题,用java多线程断点续传实践,这个程序的功能,就是可以分多个线程从目标地址上下载数据,latch.await();exec.shutdown();//第三步,把分段下载下来的临时文件中的内容写入目标文件中,每个线程负责下载一

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点中说明。   
            tempFileToTargetFile(childThreads);   
  
        } catch (InterruptedException e) {   
            e.printStackTrace();   
        }   
}

1 2 3 4 5 6  下一页

Tags:java 线程 断点

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接