package io.github.vxzh.download;
import io.github.vxzh.download.api.Connection;
import io.github.vxzh.download.api.ConnectionManager;
import io.github.vxzh.download.api.DownloadListener;
import java.util.concurrent.CyclicBarrier;
public class FileDownloader {
private String path;
private DownloadListener listener;
private ConnectionManager cm;
private static final int THREAD_NUM = 3;
public FileDownloader(String path) {
this.path = path;
}
public void execute() {
CyclicBarrier barrier = new CyclicBarrier(THREAD_NUM, new Runnable() {
@Override
public void run() {
listener.notifyFinished();
}
});
Connection conn = null;
try {
conn = cm.open(this.path);
//实际的文件长度
int length = conn.getContentLength();
//平均每一个线程下载的文件大小.
int blockSize = length / THREAD_NUM;
for (int threadId = 1; threadId <= THREAD_NUM; threadId++) {
int startIndex = (threadId - 1) * blockSize;
int endIndex = threadId * blockSize - 1;
//最后一个线程下载的长度
if (threadId == THREAD_NUM) {
endIndex = length - 1;
}
System.out.println("线程:" + threadId + "下载:---" + startIndex + "--->" + endIndex);
new DownloadThread(conn, startIndex, endIndex, barrier).start();
}
} catch (Exception 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;
}
}