您的位置:首页 > 编程语言 > Java开发

Java中ThreadPoolExecutor的参数理解

2015-08-31 14:21 357 查看


一、使用Executors创建线程池

之前创建线程的时候都是用的Executors的newFixedThreadPool(),newSingleThreadExecutor(),newCachedThreadPool()这三个方法。当然Executors也是用不同的参数去new ThreadPoolExecutor1. newFixedThreadPool()创建线程数固定大小的线程池。 由于使用了LinkedBlockingQueue所以maximumPoolSize 没用,当corePoolSize满了之后就加入到LinkedBlockingQueue队列中。每当某个线程执行完成之后就从LinkedBlockingQueue队列中取一个。所以这个是创建固定大小的线程池。2.newSingleThreadPool()创建线程数为1的线程池,由于使用了LinkedBlockingQueue所以maximumPoolSize 没用,corePoolSize为1表示线程数大小为1,满了就放入队列中,执行完了就从队列取一个。3.newCachedThreadPool()创建可缓冲的线程池。没有大小限制。由于corePoolSize为0所以任务会放入SynchronousQueue队列中,SynchronousQueue只能存放大小为1,所以会立刻新起线程,由于maxumumPoolSize为Integer.MAX_VALUE所以可以认为大小为2147483647。受内存大小限制。


二、使用ThreadPoolExecutor创建线程池


ThreadPoolExecutor的构造函数

?


参数:

1、corePoolSize核心线程数大小,当线程数<corePoolSize ,会创建线程执行runnable2、maximumPoolSize 最大线程数, 当线程数 >= corePoolSize的时候,会把runnable放入workQueue中3、keepAliveTime 保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。4、unit 时间单位5、workQueue 保存任务的阻塞队列6、threadFactory 创建线程的工厂7、handler 拒绝策略


任务执行顺序:

1、当线程数小于corePoolSize时,创建线程执行任务。2、当线程数大于等于corePoolSize并且workQueue没有满时,放入workQueue中3、线程数大于等于corePoolSize并且当workQueue满时,新任务新建线程运行,线程总数要小于maximumPoolSize4、当线程总数等于maximumPoolSize并且workQueue满了的时候执行handler的rejectedExecution。也就是拒绝策略。


ThreadPoolExecutor默认有四个拒绝策略:

1、ThreadPoolExecutor.AbortPolicy() 直接抛出异常RejectedExecutionException2、ThreadPoolExecutor.CallerRunsPolicy() 直接调用run方法并且阻塞执行3、ThreadPoolExecutor.DiscardPolicy() 直接丢弃后来的任务4、ThreadPoolExecutor.DiscardOldestPolicy() 丢弃在队列中队首的任务当然可以自己继承RejectedExecutionHandler来写拒绝策略.?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: