1.如何判断线程池所有任务是否执行完毕

package com.vipsoft.web;

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.io.File;
import java.util.concurrent.CountDownLatch; @SpringBootTest
public class ThreadTest {
Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor; @Test
void verification() throws Exception {
File f = new File("D:\\Logs\\");
CountDownLatch countDownLatch = new CountDownLatch(f.listFiles().length);
for (File file : f.listFiles()) {
if (file.isFile()) {
String fileName = file.getName();
try {
UserInfo userInfo = new UserInfo();
userInfo.getName("Name "+i);
threadExecutor(countDownLatch, userInfo);
logger.info("发出执行请求 => {}", fileName);
} catch (Exception ex) {
logger.error("异常 {}", fileName);
logger.error(ex.getMessage(), ex);
}
}
}
//阻塞当前线程,直到倒数计数器倒数到0
try {
logger.info("阻塞当前线程,直到倒数计数器倒数到0");
countDownLatch.await();
logger.info("全部处理完成");
} catch (Exception ex) {
logger.error("阻塞当前线程异常{}", ex.getMessage(), ex);
}
} void threadExecutor(CountDownLatch countDownLatch, UserInfo userInfo) {
try {
threadPoolTaskExecutor.execute(() -> {
try {
logger.info("线程名称{} {}", Thread.currentThread().getName(), userInfo.getName());
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//很关键, 无论上面程序是否异常必须执行countDown,否则await无法释放
countDownLatch.countDown();
}
});
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
}
}

多线程 ThreadPoolTaskExecutor 应用的更多相关文章

  1. Spring多线程批量发送邮件(ThreadPoolTaskExecutor)

    1,需求:使用多线程批量发送邮件 需要批量发送邮件大概400封左右,但是因为发送邮件受网络限制,所以经常导致等待超时.所以就想到了使用多线程来发邮件,因为是异步的所以返回结果不受发邮件影响. 2,思路 ...

  2. 使用Spring ThreadPoolTaskExecutor实现多线程任务

    我们为何使用多线程,之前已经有讲过了,为了更快的处理多个任务,分割任务,或者调用多个毫无关联的第三方服务 其实spring就提供了ThreadPoolTaskExecutor这个类来实现线程池,线程池 ...

  3. SpringBoot系统列 3 - 多线程数据处理(ThreadPoolTaskExecutor、DruidDataSource)

    在上篇文章的基础上进行改造: package com.hello.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; impo ...

  4. ThreadPoolTaskExecutor多线程使用,及线程池配置

    1.配置 ThreadPoolTaskExecutor bean <?xml version="1.0" encoding="UTF-8"?> &l ...

  5. spring boot: 线程池ThreadPoolTaskExecutor, 多线程

    由于项目里需要用到线程池来提高处理速度,记录一下spring的taskExecutor执行器来实现线程池. ThreadPoolTaskExecutor的配置在网上找了很多解释没找到,看了下Threa ...

  6. java:多线程基础之Runnable、Callable与Thread

    java.lang包下有二个非常有用的东西:Runnable接口与Thread类,Thread实现了Runnable接口(可以认为Thread是Runnable的子类),利用它们可以实现最基本的多线程 ...

  7. spring多线程与定时任务

    本篇主要描述一下spring的多线程的使用与定时任务的使用. 1.spring多线程任务的使用 spring通过任务执行器TaskExecutor来实现多线程与并发编程.通常使用ThreadPoolT ...

  8. Spring的线程池ThreadPoolTaskExecutor使用案例

    1.Sping配置文件 <!-- 线程池配置 --> <bean id="threadPool" class="org.springframework. ...

  9. Java多线程之线程池

    现在是多核的时代,面向多核的编程很重要,因此基于java的并发和多线程开发非常重要. 线程池是于队列密切相关的,其中队列保存了所有等待执行的任务.工作者线程的任务很简单:从队列中获取一个任务,执行任务 ...

  10. JavaEE开发之Spring中的多线程编程以及任务定时器详解

    上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...

随机推荐

  1. 在Dash中更灵活地编写回调函数

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master 大家好我是费老师,使用Dash开发过交互式应用的朋友,想必都不会对回调函数感到 ...

  2. HDL刷题:Edgedetect

    原题链接 一道想了好久的题目,在这种并行执行的程序里怎么才能保存前一个状态,看了题解后才发觉,非阻塞赋值啊,代码如下: module top_module ( input clk, input [7: ...

  3. Excel数据统计与分析

  4. Linux速查备忘手册

    速查手册 网盘文档PDF资料: 链接: https://pan.baidu.com/s/111rqKfPaAiOHSHDo1SnckA    提取码: mhkv  1. 2.  3.  4.  5. ...

  5. 悲观锁、乐观锁、mybatis-plus实现乐观锁

    悲观锁.乐观锁.mybatis-plus实现乐观锁 转载自:www.javaman.cn 1.悲观锁.乐观锁 乐观锁和悲观锁是两种用于处理并发操作的数据锁定策略.它们在处理多个事务尝试同时访问和修改同 ...

  6. Markdown References

    每次写文章,用到都要查一下的Markdown语法 字体颜色 [Markdown笔记]设置字体颜色 字体颜色 Font colors Decrsiption Demonstration Effect 选 ...

  7. Head First Java学习:第七章-继承和多态

    第七章:继承和多态 1. 覆盖(override) 覆盖的意思是由子类重新定义继承下来的方法,以改变或延伸此方法的行为. 2. 继承(extends) 类的成员:实例变量+方法 实例变量无法覆盖是因为 ...

  8. net8获取泛微token以及访问api示例

    工作中涉及到调用泛微的场景,官方的示例又臭又长,抽空用NET8简化了写法,为了简化http访问,用了Flurl.Http这个库.在座各位大佬,我们直接就看代码了   using System.Secu ...

  9. RabbitMQ入门到进阶

    1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...

  10. 2021AI量化投资训练营重磅升级,自带编程的优势显而易见

    量化交易规模突破万亿大关 国内量化交易规模快速发展,今年量化基金已突破万亿大关,并且量化私募的整体业绩十分亮眼,过去5年一线量化私募的超额收益基本在20%~30%,量化交易的占比已达到20%-30%( ...