线程池解析

一、几种常用线程池

  1. Executors.newSingleThreadExecutor() 单个的线程池 使用的LinkedBlockingQueue
  2. Executors.newFixedThreadPool(10) 固定数量线程池 使用的LinkedBlockingQueue
  3. Executors.newCachedThreadPool() 可缓存的线程池 使用的SynchronousQueue。如果线程池长度超过处理需要,可灵活回收空闲线程(构造器中默认是60S的参数),若无可回收,则新建线程
  4. 通过ThreadPoolExecutor构造器,前面三个也是通过构造方法创建
    // ThreadPoolExecutor内部使用AQS
    public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime,TimeUnit unit,
       BlockingQueue<Runnable> workQueue,
       ThreadFactory threadFactory,
       RejectedExecutionHandler handler) 
    
    

二、线程池流程

在这里插入图片描述

三、拒绝策略

  1. AbortPolicy(抛出一个异常,默认的)
  2. DiscardPolicy(直接丢弃任务)
  3. DiscardOldestPolicy(丢弃队列里最老的任务,将当前这个任务继续提交给线程池)
  4. CallerRunsPolicy(交给线程池调用所在的线程进行处理)

四、newFixedThreadPool导致的OOM(Out Of Memory)

  1. newFixedThreadPool使用了无界的阻塞队列LinkedBlockingQueue,大小为Integer.MAX_VALUE,如果任务很多会导致队列的任务越积越多,导致机器内存使用不停飙升。
  2. 可使用ThreadPoolExecutor构造器自己创建,使用有界队列ArrayBlockingQueue

参考内容

  1. https://www.cnblogs.com/jay-huaxiao/p/11454416.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值