本文只是对线程池基本概念的总结。
new Thread(new Runnable。。。)相信大家都写过,它表示的意义也很明显,我把一个runnable任务交给一个新建的线程让他执行。如果是简单的几个任务并发这就没什么问题,但是如果要同时处理许多任务或者面对更加复杂的情况的时候,频繁的创建和销毁线程带来的开销,或者线程争夺资源导致效率低下都会发生。这时候就需要线程池,一个承担全部创建线程销毁线程,以及为线程分配任务的工具。
当我们按照具体场景定制出线程池后,调用他的execute方法直接把runnable任务交给他就可以了。
1.工作流程:
具体的工作流程是这样的:线程池收到一个任务后,优先把任务交给闲置的核心线程(线程池把线程分为核心线程和非核心线程,任务优先交给核心线程),如果没有闲置的核心线程就将任务打入一个任务队列中,接下来任务的分配交给这个队列。
2.线程的生命周期:
存在一个变量time : 线程停留时间
默认的情况下,核心线程会一直存活,非核心线程闲置后停留time后销毁。如果设置allowCoreThreadTimeOut为true,则核心线程和非核心线程一样,闲置后停留time销毁。
2.定制参数:
线程池在JAVA中表现为实现了Executor的ThreadPoolExecutor类,通过他多个参数的构造器就可以定制出一个线程池。这个类有5.6.7个参数的方法,一般用五个参数的就可以,另外两个参数是错误时的抛出异常和为线程命名,一般不用考虑。
五个参数分别是:最大核心线程数,最大总线程数,停留时间,停留时间单位(秒,毫秒等枚举值),任务队列。
2.常用的任务队列类型:
SynchronousQueue:不保留任务,直接新建一个线程执行任务。为了避免线程数超出最大线程数,maximumPoolSize 一般指定成 Integer.MAX_VALUE,即无限大
LinkedBlockingQueue:如果可以新建核心线程就新建核心线程执行,不能就在队列里放着,没有最大值限制,所有任务都将被添加到队列中,maximumPoolSize 的设定失效。
ArrayBlockingQueue:可以限定长度的队列,如果可以新建核心线程就新建核心线程执行,不能就在队列里放着,线程数达到最大时新建非核心线程执行。
DelayQueue:队列内元素必须实现 Delayed 接口,这就意味着你传进去的任务必须先实现 Delayed 接口。这个队列接收到任务时,首先先入队,只有达到了指定的延时时间,才会执行任务
了解了这些,JAVA自己定义好的几种线程池也就能够看懂了。
更多:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650239804&idx=1&sn=3df2deb8eb577d577bcfb24588719365&chksm=88638253bf140b45b2d81e8e57611eb0d3284a0dbf9cbc28abbf2c8868497ca38a8f84efc3b1&mpshare=1&scene=23&srcid=08212LFrZf57BUGEdsObzCj0#rd