参考链接:https://blog.csdn.net/qq_39104442/article/details/90378858
多线程以及并发变成已经成为了必问的问题,今天就来总结下多线程在项目中的应用以及线程池的使用。
多线程的使用: 比如在庞大的项目中,一个请求中,可能要调用N多个服务, 比如调用积分服务,订单服务,地址服务,库存服务或者一些其他公司的服务等,
多次调用过程中如果每个服务都用掉500ms,那么整体的时长就是n*500,。so,这个时间是无法忍受的, 所以就要使用多线程来干这个事情了。
为了提高线程的使用率,避免造成性能的浪费, 所以这里就要用到线程池了,这里来说说线程池:
众所周知,线程池就是来管理线程的容器。
一般的面试这就会说:newCachedThreadPool,newFixedThreadPool,newSingleThreadExecutor
newScheduleThreadPool四种线程池, 然后再分别说下这些个线程池的意义。
骨灰级的玩家就会说: 线程池核心的东西就是一个ThreadPoolExecutor类。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
这里对这些参数做做个解释:
corePoolSize;核心线程数, 当任务数量超过了核心线程数,任务就会放入队列中
maximumPoolSize:最大线程数量, 当任务数量超过了最大线程数量,队列也满了, 就会执行拒绝策略,
keepAliveTime;存活时间, 当非核心线程没活干的时候, 还能活多久
unit:时间单位
workQueue:消息队列, 用来存任务, 一版有 : ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue一版使用 LinkedBlockingQueue
threadFactory:线程工厂, 用来创建线程池
handler: 处理器, 表示拒绝策略, 一般有四种:ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。