阅读 76

线程池

为什么要使用线程池?

       反复创建线程开销大、过多的线程会占用太多内存

线程池的好处:加快响应速度、合理利用CPU和内存、统一管理

线程池中构造方法的参数

corePoolSize指的是核心线程数

       线程池在完成初始化后,默认情况下,线程池中并没有任何线程,线程池会等待有任务到来时,再创建新线程去执行任务

maxPoolSize最大量

       在核心线程数的基础上,额外增加的线程数的上限

keepAliveTime

       如果线程池当前的线程数多于corePoolSize,那么如果多余的线程空闲时间超过keepAliveTime,它们就会被终止

workQueue工作队列:

       3种最常见的队列类型:

              直接交换:SynchronousQueue

              无界队列:LinkedBlockingQueue

              有界的队列:ArrayBlockingQueue

ThreadFactory用来创建线程

       默认使用Executors.defaultThreadFactory()

       创建出来的线程都在同一个线程组

添加线程规则:

       如果线程数小于corePoolSize,则创建一个新线程来运行新任务

       如果线程数等于或大于corePoolSize但少于maxinumPoolSize,则将任务放入队列

       如果队列已满,并且线程数小于maxPoolSize,则创建一个新线程

       如果队列已满,并且线程数大于或等于maxPoolSize,则拒绝

是否需要增加线程的判断顺序是:corePoolSize、workQueue、maxPoolSize

增减线程的特点:

       通过设置corePoolSize和maxinumPoolSize相同,就可以创建固定大小的线程池

       线程池希望保持较少的线程数,并且只有在负载变得很大时才增加它

       通过设置maxinumPoolSize为很高得值,可以允许线程池容纳任意数量得并发任务

       只有在队列填满时才会创建多于corePoolSize的线程,如果使用的是无界队列,那么线程数就不会超过corePoolSize。

 

线程池应该手动创建还是自动创建?

       手动创建更好,可以更加明确线程池的运行规则,避免资源耗尽的风险

       自动创建线程池(直接调用jdk封装好的构造方法)可能带来的问题?

       newFixedThreadPool 容易造成大量内存占用。可能会导致OOM

       newSingleThreadExecutor 当请求堆积的时候,可能会占用大量的内存

标签:corePoolSize,创建,队列,线程,内存,maxPoolSize
来源: https://www.cnblogs.com/LinAlex/p/15385592.html


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐