今天作了一个需求要求登陆系统后记录全部人的全部操做,因为该类型操做任务量小可是却不少,因此想到了用线程池,实现异步操做,避免同步操做影响性能。选择了spring的线程池基于xml配置文件进行配置。线程数和队列项目实际状况进行配置
Java提供了4钟线程池:
newCachedThreadPool
特性:
- 它是一个能够无限扩大的线程池;
- 它比较适合处理执行时间比较小的任务(只有任务小,线程数比较多才能复用);
- corePoolSize为0,maximumPoolSize为无限大,意味着线程数量能够无限大;
- keepAliveTime为60S,意味着线程空闲时间超过60S就会被杀死;
- 采用SynchronousQueue装等待的任务,这个阻塞队列没有存储空间,这意味着只要有请求到来,就必需要找到一条工做线程处理他,若是当前没有空闲的线程,那么就会再建立一条新的线程。
newFixedThreadPool
特性:建立一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
newSingleThreadExecutor
特性:
- 它只会建立一条工做线程处理任务;
- 采用的阻塞队列为LinkedBlockingQueue
newScheduledThreadPool
特性:支持定时及周期性任务执行
spring提供了一个threadPoolTaskExecutor 线程池
须要关注,线程数,队列类型,拒绝策略
这几篇文章讲解的比较好: