0
点赞
收藏
分享

微信扫一扫

Java并发编程 - ThreadPoolExecutor 简介


Java并发编程 - ThreadPoolExecutor 简介_ThreadPool

Java并发编程 - ThreadPoolExecutor 简介_Executor_02

Java并发编程 - ThreadPoolExecutor 简介_Executor_03

三个参数的关系(当前线程数 ctn)

1. 当cnt<corePoolSize,直接创建新线程处理任务,即使线程池中其他线程空闲。

2. 当corePoolSize<=ctn<maximumPoolSize,只有当workQueue满的时候才创建新的线程去处理任务。

3. 当corePoolsize=maximumPoolsize时,创建的线程池大小是固定的,如果有新任务提交,当workQueue没满的时候,将请求放入workQueue,等待空闲线程去取出任务进行处理,如果满了,还有新任务提交,则通过具体的策略参数来指定策略去处理任务。

4. workQueue是线程池中保存等待执行的任务的阻塞队列,当提交新任务到线程池以后,线程池会根据当前线程池中正在运行着的线程的数量,决定该任务的处理方式,总共有3种:直接切换,用无界队列,用有界队列。

  • - 直接切换:这种方式常用的队列是SynchronousQueue;
  • - 使用无界队列:一般使用基于链表的阻塞队列LinkedBlockingQueue。如果使用这种方式,那么线程池中能够创建的最大线程数就是corePoolSize,而maximumPoolSize就不会起作用了。当线程池中所有的核心线程都是RUNNING状态时,这时一个新的任务提交就会放入等待队列中。
  • - 使用有界队列:一般使用ArrayBlockingQueue。使用该方式可以将线程池的最大线程数量限制为maximumPoolSize,这样能够降低资源的消耗,但同时这种方式也 使得线程池对线程的调度变得更困难,因为线程池和队列的容量都是有限的值,所以要想使线程池处理任务的吞吐率达到一个相对合理的范围,又想使线程调度相对简单,并且还要尽可能的降低线程池对资源的消耗,就需要合理的设置这两个数量。 - 如果要想降低系统资源的消耗(包括CPU的使用率,操作系统资源的消耗,上下文环境切换的开销等), 可以设置较大的队列容量和较小的线程池容量,但这样也会降低线程处理任务的吞吐量。

如果提交的任务经常发生阻塞,那么可以考虑通过调用 setMaximumPoolSize() 方法来重新设定线程池的容量。 如果队列的容量设置的较小,通常需要将线程池的容量设置大一点,这样CPU的使用率会相对的高一些。 - 但如果线程池的容量设置的过大,则在提交的任务数量太多的情况下,并发量会增加,那么线程之间的调度就是一个要考虑的问题,因为这样反而有可能降低处理任务的吞吐量。

Java并发编程 - ThreadPoolExecutor 简介_Java并发编程_04

Java并发编程 - ThreadPoolExecutor 简介_corePoolSize_05

Java并发编程 - ThreadPoolExecutor 简介_Executor_06


Java并发编程 - ThreadPoolExecutor 简介_Executor_07

Java并发编程 - ThreadPoolExecutor 简介_线程池_08

Java并发编程 - ThreadPoolExecutor 简介_Executor_09


举报

相关推荐

0 条评论