线程池(ThreadPoolExecutor)工作原理解读


几种常见线程池:
  • newScheduledThreadPool
    • 创建一个定长线程池,支持定时及周期性任务执行,可以作一个定时器使用。
  • newCachedThreadPool
    • 创建一个可缓存线程池,如果线程池长度超过需要的线程数量,可灵活回收空闲线程,若无可回收,则新建线程。
  • newSingleThreadExecutor
    • 创建一个单线程的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行,可以控制线程的执行顺序。
  • newFixedThreadPool
    • 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待;当创建的线程池数量为1的时候,类似单线程化的线程池,当为1的时候,也可控制线程执行顺序。

常用阻塞队列:
  • ArrayBlockingQueue:基于数组的阻塞队列实现,在ArrayBlockingQueue内部,维护了一个定长数组,生产者放入数据和消费者获取数据,共用同一个锁对象,者无法真正并行运行。可以控制对象内部锁是否公平锁,默认采用非公平锁。ArrayBlockingQueue和LinkedBlockingQueue,前者插入或删除元素时不会产生或销毁任何额外对象,后者会生成一个额外Node对象。长时间内需要高效并发地处理大批量数据的系统中,其对于GC存在一定的影响。

  • LinkedBlockingQueue:基于链表的阻塞队列,能够高效的处理并发数据,因其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,意味着在高并发的情况下生产者和消费者可以并行操作队列数据,以提高整个队列并发性能。没有指定容量大小,会默认无限大小容量(Integer.MAX_VALUE),如果生产者速度大于消费者速度,系统内存就有可能已被消耗殆尽了。

  • DelayQueue:当其指定的延迟时间到了,才能够从队列中获取到该元素。是一个没有大小限制的队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞。

  • PriorityBlockingQueue:基于优先级的阻塞队列(优先级的判断通过构造函数传入的Compator对象来决定),但需要注意的是并不会阻塞数据生产者,而只会在没有可消费的数据时,阻塞数据的消费者。

  • SynchronousQueue:一种无缓冲的等待队列。


常用拒绝策略:
  • AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
  • DiscardPolicy:丢弃任务,但是不抛出异常。
  • DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
  • CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务。

ThreadPoolExecutor
AbstractExecutorService
ExecutorService
Executor
execute:Runnable
submit:Runnable
submit:Callable

线程池源码解读:
  • ThreadPoolExecutor.execute(Runnable command)详解

ctl是一个Integer值,它是对线程池运行状态和线程池中有效线程数量标识字段,共32位,高3位表示"线程池状态",低29位表示"线程池中的线程数量"


private final AtomicInteger ctl = new AtomicInteger(ctlOf
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值