主要谈了java里的线程池的使用,而主要使用executors的方式去创建,比如 executors.newcachedthreadpool()
, executors.newfixedthreadpool(5)
等等,而这些方式在阿里手册
里是不被推荐的,而是推荐使用threadpoolexecutor
的方式,我想应该也是避免资源耗尽的风险吧!
线程池不允许使用 executors 去创建,而是通过 threadpoolexecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
阿里巴巴的java开发手册推荐用threadpoolexecutor创建线程池。来看看threadpoolexecutor创建线程池的api:
public threadpoolexecutor(int corepoolsize, int maximumpoolsize, long keepalivetime, timeunit unit, blockingqueue<runnable> workqueue, threadfactory threadfactory, rejectedexecutionhandler handler)
参数解释
corepoolsize : 线程池核心池的大小。 maximumpoolsize : 线程池的最大线程数。 keepalivetime : 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。 unit : keepalivetime 的时间单位。 workqueue : 用来储存等待执行任务的队列。 threadfactory : 线程工厂。 handler 拒绝策略。
原理
有请求时,创建线程执行任务,当线程数量等于corepoolsize时,请求加入阻塞队列里,当队列满了时,接着创建线程,线程数等于maximumpoolsize。 当任务处理不过来的时候,线程池开始执行拒绝策略。
阻塞队列
arrayblockingqueue :一个由数组结构组成的有界阻塞队列。 linkedblockingqueue :一个由链表结构组成的有界阻塞队列。 priorityblockingqueue :一个支持优先级排序的无界阻塞队列。 delayqueue: 一个使用优先级队列实现的无界阻塞队列。 synchronousqueue: 一个不存储元素的阻塞队列。 linkedtransferqueue: 一个由链表结构组成的无界阻塞队列。 linkedblockingdeque: 一个由链表结构组成的双向阻塞队列。
拒绝策略
threadpoolexecutor.abortpolicy: 丢弃任务并抛出rejectedexecutionexception异常。 (默认) threadpoolexecutor.discardpolicy:也是丢弃任务,但是不抛出异常。 threadpoolexecutor.discardoldestpolicy:丢弃队列最前面的任务,然后重新尝试执行任务。(重复此过程) threadpoolexecutor.callerrunspolicy:由调用线程处理该任务。
根据任务所需要的cpu和io资源的量可以分为:
为了合理最大限度的使用系统资源同时也要保证的程序的高性能,可以给cpu密集型任务和io密集型任务配置一些线程数。
如对本文有疑问, 点击进行留言回复!!
sap cloud platform destination的配置
springcloud中feign调用处理mybatis-plus Ipage反序列化问题。
Flume 史上最全面的大数据学习第十篇(一) 别再说不知道flume是什么了
网友评论