Java线程池 ThreadPoolExecutor_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java线程池 ThreadPoolExecutor

Java线程池 ThreadPoolExecutor

 2015/2/9 12:38:50  jason0389  程序员俱乐部  我要评论(0)
  • 摘要:1.java原生线程池ThreadPoolExecutor构造方法定义:java.util.concurrent.ThreadPoolExecutor.ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueue<Runnable>workQueue)java.util.concurrent.ThreadPoolExecutor
  • 标签:thread Java 线程

1.java原生线程池ThreadPoolExecutor构造方法定义:

?

class="java"> java.util.concurrent.ThreadPoolExecutor.ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)

?

?

?

java.util.concurrent.ThreadPoolExecutor.ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)

?

?

java.util.concurrent.ThreadPoolExecutor.ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

?

?

?

参数说明:

?

corePoolSize?:?池中所保存的线程数,包括空闲线程。

maximumPoolSize?:?池中允许的最大线程数。

keepAliveTime?:?当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。

unit?:?keepAliveTime?参数的时间单位。

workQueue?:?执行前用于保持任务的队列。此队列仅保持由?execute方法提交的?Runnable任务。

threadFactory?:?执行程序创建新线程时使用的工厂。

handler?:?由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。

?

现在在项目中使用到的是第二种,但知其然不知其所以然,记录一下,慢慢深入了解。

?

new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(),new ThreadPoolExecutor.CallerRunsPolicy());

其中workQueue使用LinkedBlockingQueue<Runnable>(),BlockingQueue有三种类型:直接提交,有界队列,无界队列。

所有BlockingQueue?都可用于传输和保持提交的任务。可以使用此队列与池大小进行交互:

如果运行的线程少于?corePoolSize,则?Executor始终首选添加新的线程,而不进行排队。如果当前运行的线程小于corePoolSize,则任务根本不会存放,添加到queue中,而是直接抄家伙(thread)开始运行。

如果运行的线程等于或多于?corePoolSize,则?Executor始终首选将请求加入队列,而不添加新的线程。

如果无法将请求加入队列,则创建新的线程,除非创建此线程超出?maximumPoolSize,在这种情况下,任务将被拒绝。

排队三种策略:

直接提交

有界队列

无界队列:使用无界队列(例如,不具有预定义容量的?LinkedBlockingQueue)将导致在所有corePoolSize?线程都忙时新任务在队列中等待。这样,创建的线程就不会超过?corePoolSize。(因此,maximumPoolSize的值也就无效了。)当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列;例如,在?Web页服务器中。这种排队可用于处理瞬态突发请求,当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。

?

?

参看资料:http://www.oschina.net/question/565065_86540

?

发表评论
用户名: 匿名