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

用java多线程断点续传实践

 2009-09-24 00:00:00 来源:WEB开发网   
核心提示: 对每个子线程来说,在执行完下载指定区间与长度的数据之后,用java多线程断点续传实践(3),必须通过调用CountDownLatch的countDown()方法来把这个计数器减1,2、在全面开启下载任务之后,所以下面我们来看一下具体的下载线程ChildThread,/***//***author

对每个子线程来说,在执行完下载指定区间与长度的数据之后,必须通过调用CountDownLatch的countDown()方法来把这个计数器减1。

2、在全面开启下载任务之后,主线程就开始阻塞,等待子线程执行完毕,所以下面我们来看一下具体的下载线程ChildThread。

/** *//**
*author by http://www.5a520.cn http://www.feng123.com
*/
public class ChildThread extends Thread {   
    public static final int STATUS_HASNOT_FINISHED = 0;   
    public static final int STATUS_HAS_FINISHED = 1;   
    public static final int STATUS_HTTPSTATUS_ERROR = 2;   
    private DownloadTask task;   
    private int id;   
    private long startPosition;   
    private long endPosition;   
    private final CountDownLatch latch;   
    private File tempFile = null;    
    //线程状态码   
    private int status = ChildThread.STATUS_HASNOT_FINISHED;   
  
    public ChildThread(DownloadTask task, CountDownLatch latch, int id, long startPos, long endPos) {   
        super();   
        this.task = task;   
        this.id = id;   
        this.startPosition = startPos;   
        this.endPosition = endPos;   
        this.latch = latch;   
  
        try {   
            tempFile = new File(this.task.fileDir + this.task.fileName + "_" + id);   
            if(!tempFile.exists()){   
                tempFile.createNewFile();   
            }   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
  
    }   
  
    public void run() {   
        System.out.println("Thread " + id + " run ");   
        HttpURLConnection con = null;   
        InputStream inputStream = null;   
        BufferedOutputStream outputStream = null;   
        int count = 0;    
        long threadDownloadLength = endPosition - startPosition;   
  
        try {   
            outputStream = new BufferedOutputStream(new FileOutputStream(tempFile.getPath(), true));   
        } catch (FileNotFoundException e2) {   
            e2.printStackTrace();   
        }   
           
③       for(;;){   
④           startPosition += count;   
            try {   
                //打开URLConnection   
                con = (HttpURLConnection) task.url.openConnection();   
                setHeader(con);   
                con.setAllowUserInteraction(true);   
                //设置连接超时时间为10000ms   
⑤               con.setConnectTimeout(10000);   
                //设置读取数据超时时间为10000ms   
                con.setReadTimeout(10000);   
                   
                if(startPosition < endPosition){   
                    //设置下载数据的起止区间   
                    con.setRequestProperty("Range", "bytes=" + startPosition + "-"  
                            + endPosition);   
                    System.out.println("Thread " + id + " startPosition is " + startPosition);   
                    System.out.println("Thread " + id + " endPosition is " + endPosition);   
  
                    //判断http status是否为HTTP/1.1 206 Partial Content或者200 OK   
                    //如果不是以上两种状态,把status改为STATUS_HTTPSTATUS_ERROR   
⑥                   if (con.getResponseCode() != HttpURLConnection.HTTP_OK   
                            && con.getResponseCode() != HttpURLConnection.HTTP_PARTIAL) {   
                        System.out.println("Thread " + id + ": code = "  
                                + con.getResponseCode() + ", status = "  
                                + con.getResponseMessage());   
                        status = ChildThread.STATUS_HTTPSTATUS_ERROR;   
                        this.task.statusError = true;   
                        outputStream.close();   
                        con.disconnect();   
                        System.out.println("Thread " + id + " finished.");   
                        latch.countDown();   
                        break;   
                    }   
  
                    inputStream = con.getInputStream();   
  
                    int len = 0;   
                    byte[] b = new byte[1024];   
                    while ((len = inputStream.read(b)) != -1) {   
                        outputStream.write(b, 0, len);   
                        count += len;   
                           
                        //每读满5000个byte,往磁盘上flush一下   
                        if(count % 5000 == 0){   
⑦                           outputStream.flush();   
                        }   
                    }   
  
                    System.out.println("count is " + count);    
                    if(count >= threadDownloadLength){   
                        hasFinished = true;   
                    }   
⑧                   outputStream.flush();   
                    outputStream.close();   
                    inputStream.close();   
                    con.disconnect();   
                }   
  
                System.out.println("Thread " + id + " finished.");   
                latch.countDown();   
                break;   
            } catch (IOException e) {   
                try {   
⑨                   outputStream.flush();   
⑩                   TimeUnit.SECONDS.sleep(getSleepSeconds());   
                } catch (InterruptedException e1) {   
                    e1.printStackTrace();   
                } catch (IOException e2) {   
                    e2.printStackTrace();   
                }   
                continue;   
            }                  
        }   
    }   
}  

上一页  1 2 3 4 5 6 7 8  下一页

Tags:java 线程 断点

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