线程池

前段时间面试,问到了线程池,但是自己了解地没那么深入,因此稍微整理了一下。要注意阻塞队列的种类。
实现原理:
一:具体组成:
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之内能够匹配成功,则线程继续存活,否则不存活
     
posted @ 2016-07-07 10:32  贴地  阅读(278)  评论(0)    收藏  举报