`
freeheron
  • 浏览: 68177 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ThreadPoolExecutor的corePoolSize和maximumPoolSize

    博客分类:
  • Java
阅读更多

按照JDK文档的描述,

  • 如果池中的实际线程数小于corePoolSize,无论是否其中有空闲的线程,都会给新的任务产生新的线程
  • 如果池中的线程数>corePoolSize and <maximumPoolSize,而又有空闲线程,就给新任务使用空闲线程,如没有空闲线程,则产生新线程
  • 如果池中的线程数=maximumPoolSize,则有空闲线程使用空闲线程,否则新任务放入workQueue。(线程的空闲只有在workQueue中不再有任务时才成立)

ThreadPoolExecutor中有方法setCorePoolSize()和setMaximumPoolSize来设置corePoolSize和maximumPoolSize的大小,

  • 如果新值大于旧值,则对新任务新线程
  • 如果新值小于旧值,则在有线程空闲时,减少池中的线程数

但是在实际应用中想实时修改池的线程数,得有一定的条件,特别是要减少线程数,

  • 首先,如果提交的新任务太多,以至总是没有线程空闲下来,线程就不会减少
  • 即使有线程空闲,也不一定能减少线程,这还同所使用的workQueue有关,还需要workQueue.remainingCapacity==0。在JDK所提供的所有BlockingQueue中,只有SynchronousQueue的remainingCapacity()能返回0。

而如果实际应用中需要使用ScheduledThreadPoolExecutor来安排任务,同时需要新安排的任务数又非常多,这时要即时动态线程池的大小,就几乎不可能了,因为ScheduledThreadPoolExecutor用的是LinkedBlockingQueue。这时可以按照JDK的方式实现一个自己的ScheduledThreadPoolExecutor,

首先,稍微修改一下JDK的ThreadPoolExecutor就能实现一个自己的ThreadPoolExecutor,

  • 在setCorePoolSize方法中,去掉workQueue.remainingCapacity==0的条件
  • 让ThreadPoolExecutor中的Worker的interruptIfIdle()方法给Worker设置一个标志,让这个Worker不再检查workQueue中还没有执行的任务,立即中止
  • 还有就是修改一下ThreadPoolExecutor中实现的RejectedExecutionHandler,毕竟很多情况下都可以不需要它

有了自己ThreadPoolExecutor,就可以继承它来实现自己的ScheduledThreadPoolExecutor了(再原本照抄JDK的ScheduledThreadPoolExecutor的实现就可以了^_^)。

 

终于有了符合自己需要的ScheduledThreadPoolExecutor了,现在用它来每秒运行1000个任务,还需要每个小时改变并发任务数(50~200之间的随机值),至少要维持30天。

 

分享到:
评论
2 楼 Sgr_pippo 2015-06-03  
mengjun004 写道
参考JDK文档,它的描述应该是这样的:
1) 如果空闲的线程数小于corePoolSize,创建新线程
2) 如果提交的线程数大于corePoolSize并且小于maximumPoolSize,只会有等于corePoolSize的线程数被创建,然后将打印任务提交到队列中,直到队列满了,才会创建小于等于maximumPoolSize的线程,然后将多余的任务处理掉。

请牛人解析下,谢谢!


1) 假设初始设置线程池可容纳2个线程(corePoolSize = 2),这个可以理解为“按照正常情况我就该跑两个线程,这是我的责任”。所以当池中还不足两个线程的时候,有新任务来到,不会考察有没有空闲线程,而是直接创建一个新线程

2)还是假设corePoolSize = 2, maximumPoolSize无限大, 且目前提交了3个任务,任务队列容量为1;那么执行其中两个,剩下的一个先放在任务队列中,直到前面这两个任务空出1个线程,再由这个空出的线程去执行这第三个。

3)还是上面的情况,如果提交了4个任务。相当于3个任务后,任务队列都满了。此时已经“没有办法”,只能创建新的线程(小于maximumPoolSize的部分)来执行。

4)当然,如果maximumPoolSize也Hold不住,只能把任务扔了。
1 楼 mengjun004 2012-01-09  
参考JDK文档,它的描述应该是这样的:
1) 如果空闲的线程数小于corePoolSize,创建新线程
2) 如果提交的线程数大于corePoolSize并且小于maximumPoolSize,只会有等于corePoolSize的线程数被创建,然后将打印任务提交到队列中,直到队列满了,才会创建小于等于maximumPoolSize的线程,然后将多余的任务处理掉。

请牛人解析下,谢谢!

相关推荐

    ThreadPoolExecutor线程池

    ThreadPoolExecutor的构造函数中有六个参数:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue和handler。其中,corePoolSize表示线程池维护的最少线程数量,maximumPoolSize表示线程池维护的最大...

    Android之线程池ThreadPoolExecutor的简介

    Android中的线程池ThreadPoolExecutor解决了单线程下载数据的效率慢和线程阻塞的的问题,它的应用也是优化...&lt;span xss=removed&gt;ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,

    Java线程池深度解析:提高性能的关键

    ThreadPoolExecutor提供了灵活的线程管理策略,通过corePoolSize和maximumPoolSize控制线程数量,keepAliveTime和TimeUnit控制非核心线程的空闲存活时间。重要的是,它利用BlockingQueue作为任务队列,平衡了任务...

    java线程_ThreadPoolExecutor构造方法参数的使用规则1

    public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用

    ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue&lt;Runnable&gt; workQueue, RejectedExecutionHandler handler) 其中,corePoolSize表示线程池维护线程...

    ThreadPoolExecutor线程池原理及其execute方法(详解)

    ThreadPoolExecutor的构造方法中有四个参数:corePoolSize、maximumPoolSize、keepAliveTime和workQueue。 * corePoolSize:核心线程池的线程数量,表示线程池中最少的线程数量。 * maximumPoolSize:最大线程池的...

    Android线程池管理的代码例子

    本示例将详细介绍如何在Android中使用两种主要的线程池:ThreadPoolExecutor和ScheduledExecutorService。 ThreadPoolExecutor是Java并发库中提供的一个基础线程池实现,它允许开发者自定义核心线程数、最大线程数...

    java线程池

    线程池的构造方法`ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue&lt;Runnable&gt; workQueue, RejectedExecutionHandler handler)`中的参数有着至关重要...

    线程池使用示例(含源代码)

    在Java中,我们可以使用`java.util.concurrent`包下的`ExecutorService`接口及其实现类,如`ThreadPoolExecutor`来创建和管理线程池。 线程池的主要优点包括: 1. **资源管理**:线程池能有效控制运行的线程数量,...

    ThreadPoolExecutor运转机制介绍

    在Java并发编程中,`ThreadPoolExecutor` 是一种强大的工具,它可以帮助开发者有效地管理和执行线程。`ThreadPoolExecutor` 提供了一种灵活的方式来配置线程池,通过控制线程的数量、队列的行为以及对超出容量的任务...

    Android开发中线程池的使用Demo

    在"Android开发中线程池的使用Demo"博客中,可能还会介绍如何使用`Future`和`Callable`来获取任务执行结果,以及如何通过`ThreadPoolExecutor`的其他方法(如`getActiveCount()`和`getCompletedTaskCount()`)监控...

    Android开发经验谈:并发编程(线程与线程池)(推荐)

    要创建一个线程池,需要了解几个重要的参数,如corePoolSize、maximumPoolSize、keepAliveTime、Unit、workQueue等。这些参数可以帮助我们控制线程池的行为,避免线程池中的线程数过多或过少,避免线程池中的线程长...

    线程池之ThreadPoolExecutor.docx

    线程池是多线程编程中一种高效管理线程资源的方式,主要由Java的`ThreadPoolExecutor`类实现。线程池的工作机制在于控制线程数量,它会将任务放入队列,然后根据线程池的设定创建并启动线程执行这些任务。如果线程...

    socket 线程池实现

    1. **初始化线程池**:通过`ThreadPoolExecutor`构造函数,传入核心线程数、最大线程数、线程存活时间、时间单位、工作队列和线程工厂。 ```java int corePoolSize = 10; int maximumPoolSize = 20; long ...

    AsyncLoadDemo

    在Android中,可以使用`ExecutorService`和`ThreadPoolExecutor`来创建自定义的线程池。`ExecutorService`是一个接口,`ThreadPoolExecutor`是它的实现类,我们可以设置核心线程数、最大线程数、线程空闲时间等参数...

    java 线程池实现多并发队列后进先出

    - `keepAliveTime`和`unit`:当线程池的线程数量超过`corePoolSize`时,空闲线程在等待新任务到来之前的存活时间。 - **拒绝策略**:当线程池和工作队列都满时,新任务的处理策略。默认情况下,会抛出异常,但可以...

    Java线程池,正式上线运行的源码,分享欢迎使用并提意见

    - `newFixedThreadPool(int nThreads)`:创建固定大小的线程池,corePoolSize和maximumPoolSize相等。 - `newSingleThreadExecutor()`:只有一个线程的线程池,保证任务顺序执行。 - `newCachedThreadPool()`:无界...

    线程池Thread

    在Java中,`java.util.concurrent`包提供了线程池的实现,最常用的是`ExecutorService`接口和`ThreadPoolExecutor`类。`ExecutorService`是线程池的主要接口,通过`Executors`工厂类可以方便地创建各种类型的线程池...

    了解Java线程池创建过程

    创建ThreadPoolExecutor对象时,需要指定线程池的参数,例如corePoolSize、maximumPoolSize和keepAliveTime等。然后,可以使用execute方法来执行Runnable任务。 在使用线程池时,需要注意一些问题,例如线程池的...

Global site tag (gtag.js) - Google Analytics