java线程池

一、线程池工作原理
  • 当线程数小于核心线程数时,创建线程。
  • 当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
  • 当线程数大于等于核心线程数,且任务队列已满,若线程数小于最大线程数,创建线程。
  • 若线程数等于最大线程数,则执行拒绝策略
在这里插入图片描述
线程池ThreadPoolExecutor执行规则
二、线程池创建参数详解
 private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2;
 public ExecutorService myExecutor() {
     return new ThreadPoolExecutor(
        CORE_POOL_SIZE,        //核心线程数    
        CORE_POOL_SIZE * 4,    //最大线程数
        60,                    //线程空闲时间
        TimeUnit.SECONDS,      //时间单位
        new LinkedBlockingQueue<>(QUEUE_SIZE),    //等待队列
        new ThreadFactoryBuilder().setNameFormat("StatisticsThread-%d").build(),  //线程工厂
        new ThreadPoolExecutor.CallerRunsPolicy()   //拒绝策略
     );
  }
2.1核心线程数
  • CPU密集型(CPU密集型也叫计算密集型,指的是运算较多,cpu占用高,读/写I/O(硬盘/内存)较少):corePoolSize = CPU核数 + 1
  • IO密集型(与cpu密集型相反,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。):corePoolSize = CPU核数 * 2
2.2最大线程数

最大线程数,默认为Integer.MAX_VALUE。

2.3空闲时间

       多余的空闲线程的存活时间,当前池中线程数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余线程会被销毁直到只剩下 corePoolSize 个线程为止。

2.4等待队列

      当线程数目超过核心线程数时用于保存任务的队列。(BlockingQueue workQueue)此队列仅保存实现Runnable接口的任务。(因为线程池的底层BlockingQueue的泛型为Runnable)

  • 无界队列:队列大小无限制,常用的无界的LinkedBlockingQueue,使用该队列作为阻塞队列时要尤其当心,当任务耗时较长时可能会导致大量新任务在队列中堆积最终导致OOM。使用改队列,maximumPoolSize 的值也就无效了。
  • 有界队列:当使用有限的 maximumPoolSizes 时,有界队列有助于防止资源耗尽,但是可能较难调整和控制。常用的有两类,一类是遵循FIFO原则的队列如ArrayBlockingQueue,另一类是优先级队列如PriorityBlockingQueue。PriorityBlockingQueue中的优先级由任务的Comparator决定。使用有界队列时队列大小需和线程池大小互相配合,线程池较小有界队列较大时可减少内存消耗,降低cpu使用率和上下文切换,但是可能会限制系统吞吐量。
  • 同步移交队列:如果不希望任务在队列中等待而是希望将任务直接移交给工作线程,可使用SynchronousQueue作为等待队列。SynchronousQueue不是一个真正的队列,而是一种线程之间移交的机制。要将一个元素放入SynchronousQueue中,必须有另一个线程正在等待接收这个元素。只有在使用无界线程池或者有饱和策略时才建议使用该队列。
2.5线程工厂

       为了统一在创建线程时设置一些参数,如是否守护线程,线程一些特性等,如优先级。通过这个TreadFactory创建出来的线程能保证有相同的特性。它是一个接口类,而且方法只有一个,就是创建一个线程。
        如果没有另外说明,则在同一个ThreadGroup 中一律使用Executors.defaultThreadFactory() 创建线程,并且这些线程具有相同的NORM_PRIORITY 优先级和非守护进程状态。通过提供不同的 ThreadFactory,可以改变线程的名称、线程组、优先级、守护进程状态,等等。

2.6拒绝策略
  • AbortPolicy - 抛出RejectedExecutionException异常,终止任务。
  • CallerRunsPolicy - 使用调用线程执行任务。(交由主线程执行。如果执行程序已关闭,则会丢弃该任务)
  • DiscardPolicy - 直接丢弃。(抛弃当前任务;会导致被抛弃的任务无法再次被执行)
  • DiscardOldestPolicy - 丢弃队列最老任务,然后将本次任务添加到线程池。(抛弃工作队列中旧的任务,将新任务添加进队列;会导致被丢弃的任务无法再次被执行)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值