线程池的5个重要参数(需记牢):
workQueue:工作(任务)队列corePoolSize、maximumPoolSize:最小最大线程数keepAliveTime:线程存活时间threadFactory:线程工厂handler:拒绝策略 如果运行的线程数少于corePoolSize,创建新线程来处理任务(注意,这一步需要获取全局锁)否则,说明线程数大于corePoolSize,将任务插入BlockingQueue如果插入任务失败(队列已满),且运行的线程数少于maximumPoolSize,创建新线程来处理任务(注意,这一步需要获取全局锁)否则,说明线程数大于maximumPoolSize,执行拒绝策略ThreadPoolExecutor 采取上述设计思路,是为了尽可能地避免获取全局锁,在完成预热之后(当前运行的线程数大于等于corePoolSize),则几乎所有的调用都是执行步骤2,而步骤2不需要获取全局锁
可以调用shutdown()或shutdownNow()来关闭线程池,其中原理是遍历所有工作线程,然后逐个调用线程的interrupt()来进行中断。但是它们存在一定的区别,shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。
只要调用了这两个关闭方法中的任意一个,isShutdown()就会返回true。当所有的任务都关闭后,才表示线程池关闭成功,这时调用isTerminaed()会返回true。至于调用哪一种方法来关闭线程池,应该由线程池的任务特性决定,通常调用shutdown方法来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow方法
转载于:https://www.cnblogs.com/pomer-huang/p/Java-Executor.html