JAVA多线程进行压缩文件(线程池)(CountDownLatch)详解

本文介绍如何使用Java的多线程和线程池下载线上文件到本地,再利用CountDownLatch确保所有下载任务完成后再统一进行文件夹压缩。通过`CarMergePdfFilesCallable.java`中的`downLoadFromUrl`和`toUtf8String`方法处理网络文件下载和编码问题。在实际运行中发现,多线程下载与后续的压缩操作并未按预期顺序执行,引入CountDownLatch解决了这个问题,确保所有下载任务执行完毕后才开始压缩操作。
摘要由CSDN通过智能技术生成

先说说我要做的事情吧,上一遍我已经写出了这么把文件夹进行压缩成一个zip包,所以在这个文章的基础上面就可以实现,但是问题是我这边要弄一个批量的操作,就是一次下载很多文件然后放到目录中,在进行压缩,并且文件还是线上的文件,所以我的进行下载文件到本地,这里是很需要时间的,所以在下载线上的文件这里我想着用多线程去进行下载,然后一次去进行压缩文件,好了看看代码吧

       String realPath = new File(request.getSession().getServletContext().getRealPath("/")).getParent(); //获取项目路径
        String mrker = realPath+"\\"+"合同文件"; //要创建的目录名字
        //线程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10,10,1L,
                TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(3), Executors.defaultThreadFactory(),new ThreadPoolExecutor.DiscardOldestPolicy());
        for(int i=0;i<batchSignOrderList.size();i++){ //循环 因为有很多文件夹要进行下载
            Map<String, Object> map = batchSignOrderList.get(i); //获取map 对象 然后在拿值
            String contractName = map.get("contract_name").toString(); //文件名字 我们的文件是 本地保存过名字 然后拼接域名的直接就可以访问 比如 121212121212.pdf
            String url = "http://xxxxxxxxx.cn/temp/"+contractName; //这样就可以访问文件 然后下载
            String filePath = toUtf8String(url); //给访问路劲进行 编码 防止中文 访问
            threadPool.execute(new CarMergePdfFilesCallable(filePath, map.get("batchNo").toString(), mrker)); //执行下载文件方法
        }
        //创建文件 zip
        String newzip = ZipFileUtils.createNewzip(realPath + "\\" + "待签约合同文件" + ".zip");
        //文件加入  FileOutputStream
        FileOutputStream fos1 = new FileOutputStream(new File(newzip));
        ZipFileUtils.toZ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值