简述线程池阻塞队列ArrayBlockingQueue
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类似。 所以这个用做线程池是比较适合的。
赞0
踩0