开发者社区> 问答> 正文

简述线程池阻塞队列ArrayBlockingQueue

简述线程池阻塞队列ArrayBlockingQueue

展开
收起
huc_逆天 2021-01-11 10:08:46 899 0
1 条回答
写回答
取消 提交回答
  • ArrayBlockingQueue是一个有界阻塞式的队列, 先解释有界,就是它不能动态增加长度,即初始化的时候必须制定长度, 再来看阻塞操作方法包括add,offer,put,remove,poll,take,peek,这个可以查看API。 1、add(E e):把 e 加到 BlockingQueue 里,即如果 BlockingQueue 可以容纳,则返回 true,否则报异常 2、offer(E e):表示如果可能的话,将 e 加到 BlockingQueue 里,即如果 BlockingQueue 可以容纳,则返回 true,否则返回 false 3、put(E e):把 e 加到 BlockingQueue 里,如果 BlockQueue 没有空间,则调用此方法的线程被阻断直到 BlockingQueue 里面有空间再继续 4、poll(time):取走 BlockingQueue 里排在首位的对象,若不能立即取出,则可以等 time 参数规定的时间,取不到时返回 null 5、take():取走 BlockingQueue 里排在首位的对象,若 BlockingQueue 为空,阻断进入等待状态直到 Blocking 有新的对象被加入为止 6、remainingCapacity():剩余可用的大小。等于初始容量减去当前的 size public void put(E e) throws InterruptedException { checkNotNull(e); // 非空判断 final ReentrantLock lock = this.lock; lock.lockInterruptibly(); // 获取锁 try { while (count == items.length) { // 一直阻塞,直到队列非满时,被唤醒 notFull.await(); } enqueue(e); // 进队 } finally { lock.unlock(); } }

    其他API类似。 所以这个用做线程池是比较适合的。

    2021-01-13 20:25:06
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
多线程 立即下载
低代码开发师(初级)实战教程 立即下载