六、线程并发高级部分之线程池

1. 单线程线程池 newSingleThreadExecutor

线程池只有一个线程在工作,单线程串行执行所有任务,如果异常,按照提交顺序选择新线程继续执行。

2. 可缓存的线程池 newCachedThreadPool

调用execute将重用以前构造的线程,线程不可用才创建新线程,60s未使用会被移除。

3. 固定大小的线程池 newFixedThreadPool

可以指定同时访问的线程数量,源码创建了指定大小的LinkedBlockingQueue的线程池

4. 线程池的好处

降低资源消耗,提高响应速度,提高线程可管理性,防止服务器过载CPU耗尽。

5. 线程使用范围

单个任务小,任务数量大,要求响应速度大,突发性的大量客户请求。

6. 线程池工作机制及原理

核心队列:线程等待池(BlockingQueue);任务处理池(正在工作的Thread列表)。
线程池核心参数:核心池大小(corePoolSize):固定大小后,线程池的稳定峰值达到这个值后,池的线程数大小不会释放。
最大处理线程池数(maximumPoolSize):当池里的线程数在核心池大小和最大处理线程池数之间可以动态创建与回收线程池里面的线程的资源。
corePoolSize为线程池的大小,类似正式工人,maximumPoolSize更像是一种补救措施,类似临时工人。

7. 自定义线程池与ExecutorService

7.1 ExecutorService 主要元素:
请添加图片描述
7.2 RejectedExecutionHandler处理丢弃线程的异常处理接口

线程池任务拒绝策略
AbortPolicy:直接抛出异常;
CallerRunsPolicy:只用调用者所在线程来运行任务;
DiscardOldestPolicy:丢弃队列里最近的一个任务,执行当前任务;
DiscardPolicy:不处理,丢弃。

7.3 ThreadPoolExecutor线程池核心类

共有4个构造器,构造器参数详解:
int corePoolSize:核心池大小,在任务没有到来之前创建coorPoolSize个线程或者一个线程。默认情况下创建线程池后有0个线程,当达到corePoolSize个线程数后将到达的任务放在缓存队列中。
int maximumPoolSize:线程池最大线程数。
long keepAliveTime:线程池没有任务时最多保持多久才终止。默认情况下线程数大于corePoolSize时才起作用。
TimeUnit unit:参数keepAliveTime的时间单位。
BlockingQueue workQueue:阻塞队列,用来存储等待执行的任务。(ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue)。
ThreadFactory threadFactory:线程工厂,用来创建线程,默认Executors.defaultThreadFactory()。
RejectedExecutionHandler handler:表示当拒绝处理任务时的策略。(ThreadPoolExecutor.AbortPolicy-默认;ThreadPoolExecutor.DiscardPolicy;ThreadPoolExecutor.DiscardOldestPolicy;ThreadPoolExecutor.CallerRunsPolicy)

8. 线程池使用时需要注意的几点

8.1 不要在services方法里创建线城池,每次方法调用将会创建一堆线程池。
8.2 合理设置线程池数量,可以指出服务器暂时很忙的相应来拒绝请求。
8.3 注意死锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值