iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中多线程下载图片并压缩能不能提高效率
  • 142
分享到

Java中多线程下载图片并压缩能不能提高效率

2023-06-20 13:06:34 142人浏览 独家记忆
摘要

小编给大家分享一下Java中多线程下载图片并压缩能不能提高效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言需求 导出excel:本身以为是一个简单得导出,但

小编给大家分享一下Java中多线程下载图片并压缩能不能提高效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

前言

需求 导出excel:本身以为是一个简单得导出,但是每行得记录文件中有一列为图片url,需要下载所有记录行对应得图片,然后压缩整个文件夹。

Java中多线程下载图片并压缩能不能提高效率

这里只做4.5.得代码讲解描述,其它也没什么好说得,话不多说上代码.

实现思路

线程实现使用了线程池,jdk1.8并发包下的CompletableFuture

得到基础数值

// 线程数        Integer threadNum = 10;        // 每条线程需要处理的图片数          int dataNum = imageInfoVos.size() / threadNum;        // 写入线程数        List<Integer> threadS = new ArrayList<>();        for(int i=0; i<threadNum; i++){                threadS.add(i);        }

首先我们保存了需要下载的图片的Url列表,多线程的方式下载我们需要保证每个线程下载的图片不会重复,因此我们需要根据规则来切割保存Url列表的集合,从而保证每个线程下载属于自己的任务,上代码:

 // 接上文代码 threadS.stream().map(item -> CompletableFuture.runAsync(() ->{                List<Image> theadItem = imageInfoVos.subList(dataNum * item,(item+1)==threadNum?imageInfoVos.size():Math.min(dataNum * (item + 1 ), imageInfoVos.size()));                        threadDownPic(theadItem,item,dirName);            },threadPoolTaskExecutor)).collect(Collectors.toList()).forEach(item ->{                try {                    item.get();                }catch (Exception e){                    log.error("============  多线程down执行等待异常 msg:{} =============", e.getMessage());                }    });

这里进行拆分讲解

使用CompletableFuture.runAsync 走异步方式,遍历item

如item=10,也就是线程数为10,则直接执行10次(有线程池的前提下)

 // 使用CompletableFuture.runAsync 走异步方式,遍历item // 如item=10,也就是线程数为10,则直接执行10次(有线程池的前提下) threadS.stream().map(item -> CompletableFuture.runAsync(() ->{

规则:根据item数值通过sublist 从开始到结束,截取对应线程所需要下载的Url列表

例:dataNum为每个线程需要完成的下载数如上文 dataNum为100时

如:item=0 dataNum* item(0) =0,Math.min(dataNum * (item + 1 )=100

(item+1)==threadNum?imageInfoVos.size() 此次是为了保证最后一个线程处理最后不足的图片

根据如上规则即可得到每个线程需要下载的图片Url保证不会重复

   // 根据item数值通过sublist 从开始到结束,截取对应线程所需要下载的Url列表   // 例:dataNum为每个线程需要完成的下载数如上文 dataNum为100时   // 如:item=0 dataNum* item(0) =0,Math.min(dataNum * (item + 1 )=100   // 根据如上规则即可得到每个线程需要下载的图片Url保证不会重复   // (item+1)==threadNum?imageInfoVos.size() 此次是为了保证最后一个线程处理最后不足的图片   List<ImageInfoVo> theadItem = imageInfoVos.subList(dataNum * item,(item+1)==threadNum?imageInfoVos.size():Math.min(dataNum * (item + 1 ), imageInfoVos.size()));   // theadItem:图片Url  item:所属下标  dirName:写入路径url   threadDownPic(theadItem,item,dirName);

由于执行的异步方式,此处是为了线程池中所有线程都结束才能往下走,执行压缩文件步骤,这里提一嘴,如果没有手动赋予线程池,CompletableFuture默认使用ForkJoinPool.commonPool,会根据电脑核心数来指定,
比如:我本机未指定就是7个线程,执行方法时,会执行完前面7个线程任务,才会继续创建3个线程继续执行后续未完成的

   },threadPoolTaskExecutor)).collect(Collectors.toList()).forEach(item ->{                try {                    item.get();                }catch (Exception e){                    log.error("============  多线程down执行等待异常 msg:{} =============", e.getMessage());                }            });

实测

主要代码也写完了,这种方式真的能提高效率吗?下面我贴几张测试图来说明

Java中多线程下载图片并压缩能不能提高效率

其实这种方式并没有显著的提高效率,当然这是我本机环境测试的。

效率是由网速决定,而不是由本机Cpu和io决定,比如10M带宽,一个线程一个一个顺序下载,但速度是10M,10个线程,可能每个线程的速度是1M,结果没有什么两样。

相对于网速,多线程带来的cpu以及io节省的时间几乎可以忽略,瓶颈还是在网速.

以上是“Java中多线程下载图片并压缩能不能提高效率”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Java中多线程下载图片并压缩能不能提高效率

本文链接: https://www.lsjlt.com/news/296798.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中多线程下载图片并压缩能不能提高效率
    小编给大家分享一下Java中多线程下载图片并压缩能不能提高效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言需求 导出Excel:本身以为是一个简单得导出,但...
    99+
    2023-06-20
  • Java中多线程下载图片并压缩能提高效率吗
    目录前言实现思路实测前言 需求 导出Excel:本身以为是一个简单得导出,但是每行得记录文件中有一列为图片url,需要下载所有记录行对应得图片,然后压缩整个文件夹。 这里只做4....
    99+
    2024-04-02
  • Java多文件生成并压缩下载功能(思路详解)
    年前一直忙着项目现场实施,没时间整理,今天终于得空开始整理。 做WMS系统经常会遇到导出各种类型的库存单,此时就可以在后台将这些整合压缩到一个压缩包内然后再下载压缩包,一个接口就可以...
    99+
    2024-04-02
  • Java多线程并发编程提高数据处理效率是多少
    本文小编为大家详细介绍“Java多线程并发编程提高数据处理效率是多少”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java多线程并发编程提高数据处理效率是多少”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。工作场...
    99+
    2023-07-05
  • C#多线程使用Parallel.ForEach并行循环,真的能提高效能
    是的,使用Parallel.ForEach可以提高程序的执行效率。Parallel.ForEach方法可以将一个集合分成多个小块,并...
    99+
    2023-09-23
    C#
  • Python中的numpy库能否提高并发编程的效率?
    Python作为一种高级编程语言,广泛应用于人工智能、科学计算、数据分析等领域。而在这些领域中,数据处理是一项非常重要的工作。随着数据量的不断增大,数据处理的效率成为了一个非常关键的问题。在这种情况下,numpy库就显得尤为重要了。 nu...
    99+
    2023-11-07
    并发 关键字 numpy
  • Java 多线程并发编程提高数据处理效率的详细过程
    🎉工作场景中遇到这样一个需求:根据主机的 IP 地址联动更新其他模型的相关信息。需求很简单,只涉及一般的数据库联动查询以及更新操作,然而在编码实现过程中发现,由于主机的数量很多,导致...
    99+
    2023-05-14
    Java 多线程提高数据处理效率 Java 多线程并发编程
  • Java API中的编程算法能否提高编程效率?
    在软件开发的过程中,提高编程效率是每个程序员都追求的目标。而在Java开发中,Java API中提供了许多编程算法,可以帮助程序员更高效地编写程序。那么,这些算法真的能够提高编程效率吗?本文将对此进行探讨。 一、Java API中提供的编...
    99+
    2023-10-26
    api 编程算法 编程算法
  • C#中如何使用多线程编程提高并发性能
    C#中如何使用多线程编程提高并发性能随着计算机技术的飞速发展,现代软件系统对于并发性能的需求也越来越高。尤其是在处理大量并发请求、并行计算以及IO密集型操作时,单线程往往无法充分利用CPU和其他系统资源,导致性能瓶颈和响应时间延长。而使用多...
    99+
    2023-10-22
    并发性能 C#多线程编程
  • 如何在 Python 中使用多线程和多进程来提高并发性能?
    在编写 Python 程序时,我们通常会遇到需要同时处理多个任务的情况,如何有效地提高程序的并发性能是一个非常重要的问题。Python 中的多线程和多进程技术是两种常见的解决方案,本文将介绍如何使用这两种技术来提高程序的并发性能。 一、多线...
    99+
    2023-09-26
    并发 spring 自然语言处理
  • 如何在Java中使用存储和加载功能来提高学习笔记的效率?
    Java是一种广泛应用的编程语言,其强大的存储和加载功能可以帮助提高学习笔记的效率。在这篇文章中,我们将介绍如何在Java中使用存储和加载功能来实现这一目的。 一、什么是存储和加载功能? 存储和加载功能是Java中用于存储和读取数据的机制。...
    99+
    2023-09-02
    学习笔记 存储 load
  • 在Java项目中如何利用多线程实现文件下载功能
    这篇文章将为大家详细讲解有关在Java项目中如何利用多线程实现文件下载功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体内容如下import java.io.File; import j...
    99+
    2023-05-31
    java 多线程 文件下载
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作