spring的ThreadPoolTaskExecutor使用可以参考http://kim-miao.iteye.com/blog/1310015。
1.用junit跑测试用例,为什么用ThreadPoolTaskExecutor,里面的代码不执行了。看下下面代码:
private Executor priceSyncExecutor = context.getBean("priceSyncExecutor",Executor.class); try{ for(int i = 0; i < 100;i++) { final int j = i; priceSyncExecutor.execute(new Runnable() { @Override public void run() { method1(j); } }); } Thread.sleep(5000L); }catch(Exception e){ e.printStackTrace(); } public void method1(int i){ try{ Thread.sleep(1000L); System.out.println(i); }catch(Exception e){ e.printStackTrace(); } }
代码比较简单,如果没有主方法的Thread.sleep(5000L),可能一个print都没有打出来。
改变5000L的值,打印的行数也不一样。这个主要是由于executor.execute() 激活的线程都是守护线程,主线程结束,守护线程就会放弃执行,这个在业务中式符合逻辑的,在单元测试中为了看到执行效果,需要自行阻塞主线程,也就是我们这里的sleep 5000L。
顺便说下守护线程,在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 在Thanking in java 中说到:
守护线程也叫后台线程,是指在程序中运行的时候在后台提供一种通用服务的线程,并且这种并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程。比较常用的是java GC。
相关推荐
本文将详细介绍SpringBoot整合线程池ThreadPoolTaskExecutor的过程,包括使用@EnableAsync和@Async注解的方式以及在特定场景下可能出现的失效问题。 首先,线程池是一种多线程处理形式,其工作原理是预先创建一定...
在 SpringBoot 中使用 @Async 注解来实现异步操作是一种非常常见的做法,但是如果不小心,可能会导致 OOM(Out of Memory)问题。本文将详细介绍 SpringBoot 中 @Async 默认线程池导致 OOM 问题的原因、解决方法以及...
本文将深入探讨这些常见误区,并提供解决方案。 首先,我们要明确`@Async`注解的基本用法。当在方法上添加`@Async`时,该方法将会被异步执行。这意味着它不会立即返回结果,而是会由一个后台线程来处理。注意,这种...
线程阻塞的常见原因包括:线程池配置不合理,如线程池的核心线程数和最大线程数设置不当,导致任务排队或溢出;任务执行时间过长,某些任务占用线程时间过长,导致其他任务无法及时执行;资源竞争,多个线程争夺同一...
在SpringMVC中,我们可以轻松地配置和实现RESTful服务,提供JSON或XML格式的数据交换,这在构建分布式、跨平台的应用中非常常见。 **线程池(ThreadPool)** 线程池是一种多线程编程中的管理策略,用于有效地控制...
本文主要介绍了SpringBoot异步编程的知识点,涵盖了Future模式的核心思想、ThreadPoolTaskExecutor的使用、SpringBoot异步编程实战等内容。 1. Future 模式: Future模式是一种异步调用模式,在处理耗时操作和多...
下面是ThreadPoolTaskExecutor的一些常见配置选项: * corePoolSize:核心线程数,表示线程池中最少的线程数。 * maxPoolSize:最大线程数,表示线程池中最多的线程数。 * queueCapacity:队列大小,表示线程池中...
- **死锁和竞态条件**:识别和预防这两种常见的多线程问题,确保程序的稳定性和可靠性。 - **线程通信**:了解`wait()`, `notify()`, `notifyAll()`方法以及`BlockingQueue`等同步机制,用于线程间的通信和协作。 - ...
在IT行业中,尤其是在Java开发领域,Spring框架与iBatis持久层框架的组合是常见的应用架构。本篇文章将深入探讨如何在这样的环境下实现安全的线程管理,确保系统的高效、稳定运行。 首先,Spring框架提供了丰富的...
在Spring Boot应用中,多线程编程是一种常见的需求,尤其在处理耗时任务或者提高并发处理能力时显得尤为重要。实现多线程的方式有很多,例如直接使用Java的并发API,或者通过Spring提供的任务执行框架。在进行多线程...
标题中的“Spring线程池”指的是Spring框架中提供的线程池实现,它是Spring对Java的...同时,结合日志和监控工具,我们可以实时查看线程池的状态,包括当前线程数、活跃线程数、任务队列长度等,以便于诊断和解决问题。
在Java开发中,统计高并发环境下首页访问量并记录客户登录信息是一项常见的需求,这涉及到系统性能优化、数据持久化以及并发控制等多个方面。在这个项目中,开发框架选择了Spring,这是一个广泛使用的Java企业级应用...
此外,线程池监控功能则能够帮助开发者及时了解线程池运行状态,便于快速定位和解决问题。 动态线程池的实现,通常依赖于Spring Boot提供的配置灵活性。开发者可以通过配置文件或API接口来设置线程池的初始参数,如...
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(50); taskExecutor.setMaxPoolSize(100); taskExecutor.setQueueCapacity(1000); // 其他配置... return...
常见的`BlockingQueue`实现有`ArrayBlockingQueue`、`LinkedBlockingQueue`和`PriorityBlockingQueue`等。 在Spring MVC中,我们可以利用`BlockingQueue`来管理并发请求,比如在高并发环境下处理请求或者进行异步...
在Spring MVC框架中实现定时任务是一项常见的需求,特别是在企业级应用中,往往需要根据特定时间进行数据处理、报表生成或发送通知等操作。本篇将详细介绍如何在Spring MVC中配置和使用定时任务,并结合数据库中设置...
`ThreadPoolTaskScheduler`是其常见实现,它基于`ThreadPoolExecutor`。 3. **CronTrigger**: 在Spring中,我们经常用到`@Scheduled`注解配合cron表达式来实现按时间触发的任务。cron表达式是一种强大的定时表达...
在【标题】"Spring的定时任务开发及对Quartz和Timer支持"中,涉及到的是Spring在处理定时任务方面的特性,这在企业级应用中非常常见,用于执行一些周期性的后台任务,如数据同步、报表生成、清理任务等。 首先,...
2. **分布式锁**:分布式锁是多节点环境下确保数据一致性的重要工具,常见实现包括基于Zookeeper、Redis或数据库的锁机制。 3. **Nginx 请求转发**:Nginx可以通过负载均衡策略将请求转发至不同服务器,其中按权重...
19. **线程池选择**:Java的ExecutorService和Spring的ThreadPoolTaskExecutor是线程池实现。 20-21. **字符串格式化**和**时间格式化**:使用String.format()和SimpleDateFormat或DateTimeFormatter进行格式化。 ...