线程池(1) --线程池的好处以及参数说明

通过Thread创建线程的弊端

线程池(1) --线程池的好处以及参数说明_第1张图片

线程池

线程池(1) --线程池的好处以及参数说明_第2张图片

参数介绍

线程池(1) --线程池的好处以及参数说明_第3张图片

三个参数的关系:

1.当前运行的线程数小于corePoolSize时,直接创建新线程处理任务,即使其他线程空闲。

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

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

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

——直接切换:这种方式常用的队列是SynchronousQueue;

——使用无界队列:一般使用基于链表的阻塞队列LinkedBlockingQueue。如果使用这种方式,那么线程池中能够创建的最大线程数就是corePoolSize,而maximunPoolSize就不会起作用了。当线程池中所有的核心线程都是Running状态时,这时一个新的任务提交就会放入等待队列中。

——使用有界队列:一般使用ArrayBlockingQueue。使用该方式可以将线程池的最大线程数量限制为maximunPoolSize,这样能够降低资源的消耗,但同时这种方式也使得线程池对线程的调度变得更加困难,因为线程池和队列的容量都是有限的值,所以要想使线程池处理任务的吞吐率达到一个相对合理的范围,又想使线程调度相对简单,并且还要尽可能的降低线程池对资源的消耗,就需要合理的设置这两个数量。

        如果要想降低系统资源的消耗(包括CPU的使用率,操作系统资源的消耗,上下文环境切换的开销等),可以设置较大的队列容量和较小的线程池容量,但这样也会降低线程处理任务的吞吐量。

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



线程池(1) --线程池的好处以及参数说明_第4张图片

拒绝策略:1.(默认策略)直接抛出异常。2.让线程抛出异常。3.抛弃队列中最早的任务。4.抛弃当前任务。

你可能感兴趣的:(线程池(1) --线程池的好处以及参数说明)