生产者消费者以及线程池

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

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

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

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

相关文章
相关标签/搜索