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

通过Thread创建线程的弊端

线程池

参数介绍

三个参数的关系:

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.(默认策略)直接抛出异常。2.让线程抛出异常。3.抛弃队列中最早的任务。4.抛弃当前任务。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为什么使用线程池 当我们在使用线程时,如果每次需要一个线程时都去创建一个线程,这样实现起来很简单,但是会有一个问题...
    闽越布衣阅读 4,326评论 10 45
  • 2018年4月29日 星期天 天气晴 你前半生做过的事都会在你后半辈的人生里得到相应的反射,你行好事走正路,那么你...
    小铃铛er阅读 604评论 13 13
  • 家里的百合凋谢了。昨晚就兴冲冲地买了一束勿忘我,明明知道九月买的玻璃花瓶很小,但是没有想到它小到只可以插上三只勿忘...
    木子在哪阅读 212评论 0 0
  • OK,终于滚出来了,定个目标吧,搞明白了才能去买下一件电子产品!立此为证!!!让它在购物车呆着先,哼 吃吃吃,喝喝...
    碌陆巷尙gogogo阅读 195评论 0 0