线程池
前段时间面试,问到了线程池,但是自己了解地没那么深入,因此稍微整理了一下。要注意阻塞队列的种类。
实现原理:
一:具体组成:
1.CorePool
2.Blockingqueue
3.ThreadPool
4.饱和策略
二:工作过程
当提交一个新任务到线程池时,处理流程如下
1.线程池判断CorePool的线程是否都在执行任务,如果不是,则创建一个新的线程,如果是,则到下一步
2.线程池判断工作队列是否已满,未满则将任务加入到队列中,如满,进入下一步
3.线程池判断线程池的线程都在工作状态,若果没有,创建一个新的线程,如果满,交饱和策略抛出异常
线程池创建线程时,会将线程封装成工作线程worker,worker在执行完任务之后,还会循环获取工作队列里的任务来执行
三:线程池的使用
1.创建线程池:new ThreadPoolExcutor(corePoolSize,maximumPoolSize,keepAliveTime,milliseconds,runnableTaskQueue,handler)
几个参数:corePoolSize:线程池基本大小
runnableTaskQueue:任务队列,用于保存等待执行的任务的阻塞队列
a.ArrayBlockingQueue:基于数组的有界阻塞队列,按先进先出原则对元素排序
b.LinkedBlockingQueue:基于链表结构的阻塞队列,按FIFO排序元素,吞吐量高于ArrayBlockingQueue, FixedThreadPool使用了这个队列
c.SynchronousQueue:不存元素的阻塞队列,类似于生产者放完,消费者取走,否则生产者一直阻塞,吞吐量高于前两个,CachedThreadPool使用了这个队列
2.向线程池提交任务:
execute():提交不需要返回值的任务
submit():提交需要返回值的任务,返回一个future类型的对象
3.关闭线程池:
遍历线程池,逐个interrupted,
shutdown():将线程池状态设置成SHUTDOWN,结束所有没在执行的任务
shutdownNow():将线程池状态设置成STOP,尝试结束所有正在执行和没在执行的任务
四:具体实现
java的线程即是工作单元,也是执行机制,从JDK5开始,将工作单元和执行机制分开,工作单元包括Runnable和Callable,执行机制包括Executor
ThreadPoolExecutor是Excutor的核心,是线程池的实现类,主要由4个组件构成:
1.CorePool
2.Blockingqueue
3.maximumPool
4.饱和策略
可以创建三种ThreadPoolExecutor:
1.FixedThreadPool:可重用固定线程数的线程池,传入一个参数 int nThreads,corePoolSize和maximumPoolSize都被设置成nThreads,使用LinkedBlockingQueue
2.SingleThreadExecutor:,corePoolSize和maximumPoolSize都被设置成1,使用LinkedBlockingQueue
3.CacheThreadPool:传入的参数corePoolSize为0,maximumPoolSize为Integer.Max_Val,使用SynchronousQueue。如果主线程提交任务的速度高于maximumPool中线程处理任务的速度,CacheThreadPool会不断创建新线 程,
CacheThreadPool的工作原理:1.主线程向SynchronousQueue中放任务,queue.offer(),如果maximumPool中有线程空闲,匹配成功,poll(),然后execute()执行
2.如果maximumPool为空或没有空闲线程,新建一个线程
3.线程执行完成后,继续poll(),如果在60s之内能够匹配成功,则线程继续存活,否则不存活

浙公网安备 33010602011771号