生产者消费者以及线程池

生产者 数据中心 消费者 线程池Executors,四个最经典的方法newFixThreadPoll返回一个固定数量的线程池,如果执行的任务数大于线程数,会将新任务缓存到一个队列中,这个队列是newFixThreadPoll自带的一个缓存区。newSingleExcutor()创建一个线程的线程池,newCacheThreadPoll()可根据实际情况调整线程数量,不限制最大数量,有任务则创建空闲线程,空闲线程会在60秒后回收;newScheduleThreadpoll()方法,该方法返回一个ScheduleExecutorService对象,可以实现定时器的功能,但是新项目都用spring schedule了。但该线程可以指定线程数量。和newFixThreadPoll差不多,但是可以实现定时器的功能。其实底层代码实现的都是实例化threadPollExecutirs

使用有界队列,当任务数小于核心线程数,则优先创建线程。若当前线程数大于核心线程数小于maxPoolSize,则将当前任务放入有界队列,等待核心线程有空余,再执行队列中的任务。如果队列已满,则直接创建线程,执行当前任务,如果当前线程任务数(不计算队列中的,只计算正在执行的)大于maxPoolSize则执行拒绝策略 无界队列 无界队列以corePoolSize为瓶颈,当任务数小于corePoolSize有新任务时则直接创建新线程,如果大于corePoolSize则将任务放入无界队列。如果创建任务的速度大于任务处理的速度,则队列的速度增长很快,直到计算机资源耗尽。此时maxPoolSize没有任何意义

jdk提供的拒绝策略 abortPolicy 默认的 直接抛出异常,组织系统正常工作 callerRunPolicy 只要线程池未关闭,直接在调用者线程中运行当前被丢弃的任务 DIscardoldestPolicy 丢弃最老的线程,执行当前任务 DiscardPolicy 直接不处理丢弃的任务 如果需要自定义拒绝策略,可以实现rejectExecutorHandaler

大致的拒绝策略有两种,通过http请求,通知数据源此任务执行失败。或者记录日子,指定定时任务,读取日志,之所以推荐日志而不是暂存到缓存中,是因为决绝就是因为资源紧张,所以缓存和增加通知请求都显得很不合理

转载于:https://my.oschina.net/u/3357720/blog/1922940

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值