package code03;
import code03.api.Connection;
import code03.api.ConnectionException;
import code03.api.ConnectionManager;
import code03.api.DownloadListener;
import code03.impl.ConnectionManagerImpl;
import java.util.ArrayList;
import java.util.List;
/**
* 线程启动类
*/
public class FileDownloader {
private String url;
private DownloadListener listener;
private ConnectionManager cm;
private static boolean downloadFinished = false;
private final static int THREAD_NUM = 5;
public FileDownloader(String _url) {
this.url = _url;
}
/*
(1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定)
(2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有
线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。*/
public void execute(){
Connection conn = null;
try {
//启动线程
int startPos = 0, endPos = 0;
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < THREAD_NUM; i++) {
conn = cm.open(this.url); //每次都要重新获取一个connection.imputstream
int length = conn.getContentLength();
startPos = length/THREAD_NUM * i;
endPos = length/THREAD_NUM * (i + 1)- 1;
DownloadThread downloadThread = new DownloadThread(conn,startPos,endPos);
threads.add(downloadThread);
downloadThread.start();
}
//调用join方法,确保所有线程的工作已经完成
for (int i = 0; i < THREAD_NUM; i++) {
try {
threads.get(i).join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
listener.notifyFinished();
} catch (ConnectionException e) {
e.printStackTrace();
} finally {
if(conn != null){
conn.close();
}
}
}
public void setListener(DownloadListener listener) {
this.listener = listener;
}
public void setConnectionManager(ConnectionManager ucm){
this.cm = ucm;
}
public DownloadListener getListener(){
return this.listener;
}
public static void main(String[] args) {
String url = "http://litten.me/assets/blogImg/litten.png";
FileDownloader fileDownloader = new FileDownloader(url);
ConnectionManager cm = new ConnectionManagerImpl();
fileDownloader.setListener(new DownloadListener() {
@Override
public void notifyFinished() {
downloadFinished = true;
}
});
fileDownloader.setConnectionManager(cm);
fileDownloader.execute();
while (!downloadFinished){
try {
System.out.println("还没有下载完成,休眠五秒");
//休眠5秒
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("download finished ! ");
}
}