经过ThreadPoolExecutor
来建立一个线程池java
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, threadFactory,handler);
参数说明:git
corePoolSize
线程池中任务的基本个数
maximumPoolSize
线程chi池中任务的作多个数
keepAliveTime
线程池的工做线程空闲后存活的时间milliseconds
配合上个参数使用,表示时间的单位,如TimeUnit.SECONDS
runnableTaskQueue
排队队列
ArrayBlockingQueue
基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序LinkedBlockingQueue
基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量一般要高于ArrayBlockingQueueSynchronousQueue
一个不存储元素的阻塞队列。每一个插入操做必须等到另外一个线程调用移除操做,不然插入操做一直处于阻塞状态,吞吐量一般要高于LinkedBlockingQueuePriorityBlockingQueue
一个具备优先级得无限阻塞队列threadFactory
建立线程的工厂,一般会从新指定线程名,方便debughandler
线程池饱和策略
CallerRunsPolicy
只用调用者所在线程来运行任务DiscardOldestPolicy
丢弃队列里最近的一个任务,并执行当前任务DiscardPolicy
不处理,丢弃掉AbortPolicy
抛异常线程池提交任务的处理流程数据库
execute(Runnable)
直接执行一个实现了Runnable的接口,即表示提交了一个异步任务给线程池数组
submit(Runnable)
相比较于上面的,区别是这个会返回一个 Future<V>
对象,经过调用future.get()
能够获取线程的返回值,其中这个方程是线程阻塞的,直到返回告终果以后,才会继续执行下去微信
线程池的shutdown或shutdownNow方法来关闭线程池框架
shutdown的原理是只是将线程池的状态设置成SHUTDOWN状态,而后中断全部没有正在执行任务的线程异步
shutdownNow的原理是遍历线程池中的工做线程,而后逐个调用线程的interrupt方法来中断线程,因此没法响应中断的任务可能永远没法终止ui
调用了这两个关闭方法的其中一个,isShutdown方法就会返回true。当全部的任务都已关闭后,才表示线程池关闭成功,这时调用isTerminaed方法会返回true。.net
至于咱们应该调用哪种方法来关闭线程池,应该由提交到线程池的任务特性决定,一般调用shutdown来关闭线程池,若是任务不必定要执行完,则能够调用shutdownNow线程
分析
获取线程数
Runtime.getRuntime().availableProcessors()
背景:
实现一个异步的报警case,首先是有三种报警方式,邮件、微信、短信;其次是具体的报警都是异步处理(一个报警执行的线程池);要求一分钟内报警有上限设置(即要实现报警的计数与清零);报警的重要性根据邮件-》微信-》短信进行递增,当超过每一个报警类型的最低阀值时,晋升报警类型
silver-alarm
一个报警的基本框架