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