多线程下载图片实例 java
时间: 2023-10-26 07:06:41 浏览: 40
下面是一个多线程下载图片的 Java 实例代码:
```java
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadImageDownloader {
public static void main(String[] args) throws Exception {
String[] imageUrls = { "https://example.com/image1.jpg", "https://example.com/image2.jpg", "https://example.com/image3.jpg" };
ExecutorService executor = Executors.newFixedThreadPool(imageUrls.length);
for (String imageUrl : imageUrls) {
executor.execute(new ImageDownloader(imageUrl));
}
executor.shutdown();
}
private static class ImageDownloader implements Runnable {
private String imageUrl;
public ImageDownloader(String imageUrl) {
this.imageUrl = imageUrl;
}
@Override
public void run() {
try {
URL url = new URL(imageUrl);
InputStream in = url.openStream();
FileOutputStream out = new FileOutputStream(getFileName(imageUrl));
byte[] buffer = new byte[1024];
int length = 0;
while ((length = in.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
in.close();
out.close();
System.out.println("Downloaded " + imageUrl);
} catch (Exception e) {
System.out.println("Error downloading " + imageUrl);
}
}
private String getFileName(String url) {
int index = url.lastIndexOf("/");
return "image" + url.substring(index);
}
}
}
```
该程序会并发下载多张图片,并将每张图片保存到本地文件系统中。该程序使用了 Java 的线程池 ExecutorService 来管理多线程。每个任务都是一个 ImageDownloader 对象,它实现了 Runnable 接口并重写了 run() 方法。在 run() 方法中,程序会从指定的 URL 中读取图片数据,并将数据写入到本地文件中。最后,程序会输出成功下载的图片的 URL。
该程序的运行结果如下:
```
Downloaded https://example.com/image1.jpg
Downloaded https://example.com/image3.jpg
Downloaded https://example.com/image2.jpg
```
可以看到,三张图片都被成功下载并保存到本地文件系统中。该程序可以根据实际需要进行修改和优化,例如增加异常处理机制、设置超时时间、使用线程池等。