多线程下载图片等待图片下载完代码实现

Future 实现方式


import java.io.IOException;  
import java.net.URL;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.concurrent.Callable;  
import java.util.concurrent.ExecutionException;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.concurrent.Future;  public class ImageDownloader {  public static void main(String[] args) {  // 假设这是你的图片URL列表  List<String> imageUrls = List.of(  "http://example.com/image1.jpg",  "http://example.com/image2.jpg",  // ... 其他图片URL  );  ExecutorService executorService = Executors.newFixedThreadPool(10); // 创建一个固定大小的线程池  List<Future<Void>> futures = new ArrayList<>();  for (String imageUrl : imageUrls) {  Future<Void> future = executorService.submit(new DownloadTask(imageUrl));  futures.add(future);  }  // 等待所有任务完成  for (Future<Void> future : futures) {  try {  future.get(); // 这会阻塞,直到任务完成或抛出异常  } catch (InterruptedException | ExecutionException e) {  e.printStackTrace();  }  }  // 关闭线程池  executorService.shutdown();  System.out.println("所有图片已下载完成");  }  static class DownloadTask implements Callable<Void> {  private final String imageUrl;  public DownloadTask(String imageUrl) {  this.imageUrl = imageUrl;  }  @Override  public Void call() throws Exception {  // 这里是下载图片的代码,你可以使用任何你喜欢的库或方法来实现  URL url = new URL(imageUrl);  // ... 下载图片并保存到本地或其他地方  return null;  }  }  
}

CountDownLatch 实现方式


import java.io.IOException;  
import java.net.URL;  
import java.util.concurrent.CountDownLatch;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  public class ImageDownloaderWithCountDownLatch {  public static void main(String[] args) {  // 假设这是你的图片URL列表  String[] imageUrls = {  "http://example.com/image1.jpg",  "http://example.com/image2.jpg",  // ... 其他图片URL  };  int threadCount = imageUrls.length; // 图片数量,即需要启动的线程数  CountDownLatch latch = new CountDownLatch(threadCount); // 初始化 CountDownLatch  ExecutorService executorService = Executors.newFixedThreadPool(threadCount); // 创建一个固定大小的线程池  // 提交下载任务到线程池  for (String imageUrl : imageUrls) {  executorService.submit(() -> {  try {  downloadImage(imageUrl); // 下载图片的方法  } catch (IOException e) {  e.printStackTrace();  } finally {  latch.countDown(); // 下载完成后,计数器减一  }  });  }  try {  // 等待所有图片下载完成  latch.await();  System.out.println("所有图片已下载完成");  } catch (InterruptedException e) {  e.printStackTrace();  } finally {  // 关闭线程池  executorService.shutdown();  }  }  private static void downloadImage(String imageUrl) throws IOException {  // 这里是下载图片的代码,你可以使用任何你喜欢的库或方法来实现  URL url = new URL(imageUrl);  // ... 下载图片并保存到本地或其他地方  System.out.println("下载了图片: " + imageUrl);  }  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/795853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java框架学习——反射概述及简易版框架搭建

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! 反射 反射&#xff08;Reflection&#xff09;&#xff1a;加载类&#xff0c;并允许以编程的方式解剖类中的各种成分&#xff08;成员变量&#xff0c;方法&#xff0c;构造器等&#xff09; 1&…

C++之类和对象(上)

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1访问限定符 4.2 类的两种定义方式 第一种&#xff1a; 第二种&#xff1a; 4.3封装 5.类的实例化 6.类对象模型 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;…

【ARM 嵌入式 C 文件操作系列 20 -- 文件删除函数 remove 详细介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 文件删除函数 remove 文件删除函数 remove 在 C 语言中&#xff0c; 可以使用 remove 函数来删除一个文件&#xff0c;但在删除之前 可能想确认该文件是否存在。 可以使用 stat 函数来检查文件是否存在。 以下是如何实现这个功能…

出门一笑, “栈” 落江横 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

03-自媒体文章发布

自媒体文章发布 1)自媒体前后端搭建 1.1)后台搭建 ①&#xff1a;资料中找到heima-leadnews-wemedia.zip解压 拷贝到heima-leadnews-service工程下&#xff0c;并指定子模块 执行leadnews-wemedia.sql脚本 添加对应的nacos配置 spring:datasource:driver-class-name: com…

23年蓝桥杯省赛 动态规划DP

动态规划 就是:给定一个问题&#xff0c;我们把它拆成一个个子问题&#xff0c;直到子问可以直接解决。然后把子问题的答案保存起来&#xff0c;以减少重量计算&#xff0c;再根据子问题答察反推&#xff0c;得出问解的一种方法。 题目&#xff1a; 这天&#xff0c;一只蜗牛…

QT串口接收数据并进行波形显示(含源码)

**使用QT在串口调试助手基础上实现波形显示&#xff08;含源码&#xff09; 评论比较多留言需要源码的&#xff0c;逐个发邮箱比较麻烦也不能及时回复&#xff0c;现将源码上传至链接&#xff08;无需积分下载&#xff09;https://download.csdn.net/download/m0_51294753/877…

mysql 8.0 常用函数大全总结,并列出实例

MySQL 8.0提供了丰富的内置函数&#xff0c;这些函数可以大致分为几个类别&#xff1a;字符串函数、数值函数、日期和时间函数、比较函数、逻辑函数、控制流函数等。以下是20个常用的MySQL函数及其简单的使用示例&#xff1a; 1. **CONCAT()**: 字符串连接函数。 - 示例&am…

设计一个可扩展的Python Web框架:并发、性能与安全性考量

设计一个可扩展的Python Web框架&#xff1a;并发、性能与安全性考量 一、引言 随着Web应用的日益复杂和需求的不断增长&#xff0c;一个可扩展的Web框架变得至关重要。在Python生态系统中&#xff0c;虽然存在诸多优秀的Web框架&#xff0c;但设计一个符合自身需求且具备高度…

云服务器4m带宽是什么意思?

云服务器配置4M带宽是什么意思&#xff1f;4M代表该台云服务器的网络传输速度为4Mbps&#xff0c;一般指该台云服务器的公网出方向带宽&#xff0c;即从云服务器下载的公网带宽&#xff0c;4M带宽下载速度为512KB/秒&#xff0c;云服务器吧yunfuwuqiba.com整理常见的云服务器公…

Java之过滤器Filter、拦截器Interceptor与面向切面AOP

Java之过滤器Filter、拦截器Interceptor与面向切面AOP Filter的使用 Component WebFilter(urlPatterns {"/*"}) public class CustomFilter implements Filter {Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain cha…

cJSON(API的详细使用教程)

我们今天来学习一般嵌入式的必备库&#xff0c;JSON库 1&#xff0c;json和cJSON 那什么是JSON什么是cJSON&#xff0c;他们之间有什么样的关联呢&#xff0c;让我们一起来探究一下吧。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&…

C和C++内存管理

目录&#xff1a; 一&#xff1a;C和C内存分布 二&#xff1a;C动态内存管理方式 三&#xff1a;C动态内存管理方式 四&#xff1a;operator new与operator delete函数 五&#xff1a;new和delete的实现原理 六&#xff1a;定位new表达式(placement-new) 七&#xff1…

使用YOLOv8训练自己的【目标检测】数据集

文章目录 1.收集数据集1.1 使用开源已标记数据集1.2 爬取网络图像1.3 自己拍摄数据集1.4 使用数据增强生成数据集1.5 使用算法合成图像 2.标注数据集2.1确认标注格式2.2 开始标注 3.划分数据集4.配置训练环境4.1获取代码4.2安装环境 5.训练模型5.1新建一个数据集yaml文件5.2预测…

了解IP地址的基本概念和修改步骤

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;其重要性不言而喻。无论是为了提升网络性能&#xff0c;还是出于隐私保护的需求&#xff0c;修改IP地址都是网络使用者可能遇到的操作。虎观代理将详细介绍如何修改IP地址&#xff0c;并探讨在修改过程中需要…

python+flask+django文献文件资料搜索系统

后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 本系统在设计过程中&#xff0c;很好地发挥了该开发方式的优…

刷题DAY45 | 70-爬楼梯(进阶) LeetCode 322-零钱兑换 279-完全平方数

70 爬楼梯&#xff08;进阶&#xff09; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 输入描述 输入共一行&#xff0c;包含两个正整数&…

120.单例模式(C++设计模式)

一、什么是单例模式 单例模式是一种创建型设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。 在C中实现单例模式通常会遵循以下步骤&#xff1a; 私有构造函数&#xff1a;确保单例类的构造函数是私有的&#xff0c;这样外部就…

例47:键盘事件演示

建立一个EXE工程&#xff0c;在默认窗体上放一个Image框和一一个text框。在text的按键事件中输入代码&#xff1a; Function Form1_Text1_WM_KeyDown(hWndForm As hWnd, hWndControl As hWnd,nVirtKey As Long, lKeyData As Long) As LongIf nVirtKey VK_SPACE ThenImage1.Pi…

【题单】 洛谷哈希题单

这里写目录标题 updata普及-普及/提高-普及/提高提高/省选-省选/NOI−NOI/NOI/CTSC updata 2024.04.06 15:35 发布此文章 普及- P1102 A-B 数对 P1211 [USACO1.3] 牛式 Prime Cryptarithm P2957 [USACO09OCT] Barn Echoes G P3370 【模板】字符串哈希 P4305 [JLOI2011] 不重…