java队列以及线程池简单介绍

队列(具体点击去看源码)

  • ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列 默认构造ArrayBlockingQueue(int capacity)
  • LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。默认构造LinkedBlockingQueue() { this(Integer.MAX_VALUE); }
  • PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。默认构造:PriorityBlockingQueue() { this(DEFAULT_INITIAL_CAPACITY, null); } DEFAULT_INITIAL_CAPACITY = 11
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。public DelayQueue() {} 该队列的节点必须要继承Delay类
  • SynchronousQueue:一个不存储元素的阻塞队列。 默认构造:SynchronousQueue(){this(false)} public SynchronousQueue(boolean fair){} fair 如果为true遵循FIFO原则,否则进来一个节点会先尝试不经过队列直接给线程处理
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。 LinkedTransferQueue() {} 重点:无界队列
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。 public LinkedBlockingDeque() { this(Integer.MAX_VALUE); } 首先它是有界的,默认为整形最大值。他的特点是可以头进,头取,尾插,尾取
方法/处理方式抛出异常返回特殊值一直阻塞超时退出
插入方法add(e)offer(e)put(e)offer(e,time,unit)
移除方法remove()poll()take()pull(time,unit)
检查方法element()peek()不可用不可用

四个已封装好的线程池

  • newSingleThreadExecutor
    默认构造函数 ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()));
    “解释”:核心线程数为1,最大线程数为1即本线程数只有1个线程,使用的是链表有界队列
    两个主要API:
    - invokeAll(Collection<? extends Callable> tasks) 执行 集合里所有并返回集合返回值
    - invokeAny(Collection<? extends Callable> tasks)执行 集合里其中一个并返回返回值

  • newCachedThreadPool
    默认构造函数 ThreadPoolExecutor() -> newCachedThreadPool(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue());
    “解释”:无核心函数,表名队列直接提交给非核心线程执行,空闲线程60秒无任务便执行销毁,使用不存储元素的阻塞队列。
    两个主要API:
    - invokeAll(Collection<? extends Callable> tasks) 执行 集合里所有并返回集合返回值
    - invokeAny(Collection<? extends Callable> tasks)执行 集合里其中一个并返回返回值

  • newFixedThreadPool
    默认构造函数 ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
    “解释”:核心线程和最大线程一样,所以不需要设定空闲线程回收时间,使用的队列是链表有界阻塞队列
    两个主要API:

     - invokeAll(Collection<? extends Callable<T>> tasks) 执行 集合里所有并返回集合返回值
     - invokeAny(Collection<? extends Callable<T>> tasks)执行 集合里其中一个并返回返回值
    
  • newScheduledThreadPool
    默认构造函数 newScheduledThreadPool(int corePoolSize)-> super(corePoolSize, Integer.MAX_VALUE, DEFAULT_KEEP_ALIVE_MILLIS, MILLISECONDS, new DelayedWorkQueue());
    “解释”:必须传一个核心线程数,DEFAULT_KEEP_ALIVE_MILLIS=10,
    三个主要API:
    - schedule 经过一段时间执行,执行一次。 两个重载方法,一个是传入Runnable,一个是传入Callable,在加上时间和时间单位
    - scheduleWithFixedDelay 先执行一次,在经过特定时间周期循环
    - scheduleAtFixedRate 经过特定时间后开始周期循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值