例子:
ThreadPoolExecutor executorPool =
new ThreadPoolExecutor(3, 5, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(50));
3是corePoolSize
- 意味着Jvm将为前3个任务的新任务创建新线程。并且其他任务将被添加到队列中,直到队列变满(50个任务)。
5是maxPoolSize
- JVM可以创建最多5个线程。表示如果已经有3个任务/线程正在运行且队列已满,有50个待处理任务,并且如果还有一个新请求/任务到达队列,那么JVM将创建最多5个新线程(总线程数=前3个+新2个) ;
new LinkedBlockingQueue
(50) - 总队列大小 - 它可以在其中排队50个任务。
即当请求进入时,线程将最多创建3个,然后新请求将被添加到队列中,直到达到50,当队列已满时,将创建最新的线程maxPoolSize
。一旦所有线程都在使用并且队列已满,任务将被拒绝。随着队列的减少,活动线程的数量也会减少。
SUN内部创建线程的规则:
- 如果线程数小于
corePoolSize
,则创建一个新线程以运行新任务。 - 如果线程数等于(或大于)
corePoolSize
,则将任务放入队列。 - 如果队列已满,并且线程数小于
maxPoolSize
,则创建一个新线程以运行任务。 - 如果队列已满,并且线程数大于或等于
maxPoolSize
,则拒绝该任务。
拒绝策略
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException
异常。 (默认)
ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最旧的任务,然后重新提交被拒绝的任务
ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务