java多线程下载器工具示例
时间: 2024-10-01 15:11:38 浏览: 36
在Java中,创建一个多线程下载器通常涉及到继承Thread类或实现Runnable接口来创建自定义的线程。这里提供一个简单的示例,使用ExecutorService和Callable接口:
```java
import java.io.InputStream;
import java.net.URL;
import java.util.concurrent.*;
public class MultiThreadedDownloader {
private ExecutorService executor;
public MultiThreadedDownloader(int threadCount) {
executor = Executors.newFixedThreadPool(threadCount);
}
// 定义任务下载文件
static class DownloadTask implements Callable<InputStream> {
private final String url;
public DownloadTask(String url) {
this.url = url;
}
@Override
public InputStream call() throws Exception {
URL obj = new URL(url);
return obj.openStream();
}
}
// 下载文件的主方法
public void downloadFiles(String[] urls) {
List<Future<InputStream>> futures = new ArrayList<>();
for (String url : urls) {
Future<InputStream> future = executor.submit(new DownloadTask(url));
futures.add(future);
}
// 等待所有任务完成并关闭流
try {
for (Future<InputStream> future : futures) {
InputStream input = future.get(); // 获取结果
// 使用输入流处理下载后的数据...
input.close();
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
}
// 示例用法
public static void main(String[] args) {
MultiThreadedDownloader downloader = new MultiThreadedDownloader(5); // 创建5个线程
String[] urls = {"http://example.com/file1", "http://example.com/file2", ...}; // 要下载的URL列表
downloader.downloadFiles(urls);
}
}
```
在这个例子中,我们创建了一个固定大小的线程池,并提交了DownloadTask到线程池,每个任务代表从指定URL下载一个文件。当所有任务完成后,主线程会等待所有Future完成并关闭流。
阅读全文