打字猴:1.700451519e+09
1700451519
1700451520 for(int i=0;i<10;i++){
1700451521
1700451522 bq.add(””);
1700451523
1700451524 }
1700451525
1700451526 }
1700451527
1700451528 BlockingQueue能够自行扩容吗?答案是不能,运行结果如下:
1700451529
1700451530 Exception in thread”main”java.lang.IllegalStateException:Queue full
1700451531
1700451532 at java.util.AbstractQueue.add(AbstractQueue.java:71)
1700451533
1700451534 at java.util.concurrent.ArrayBlockingQueue.add(ArrayBlockingQueue.java:209)
1700451535
1700451536 at Client.main(Client.java:12)
1700451537
1700451538 没错,报队列已满异常,这是阻塞队列和非阻塞队列一个重要区别:阻塞队列的容量是固定的,非阻塞队列则是变长的。阻塞队列可以在声明时指定队列的容量,若指定的容量,则元素的数量不可超过该容量,若不指定,队列的容量为Integer的最大值。
1700451539
1700451540 阻塞队列和非阻塞队列有此区别的原因是阻塞队列是为了容纳(或排序)多线程任务而存在的,其服务的对象是多线程应用,而非阻塞队列容纳的则是普通的数据元素。我们来看一下ArrayBlockingQueue类最常用的add方法。
1700451541
1700451542 public class ArrayBlockingQueue<E>extends AbstractQueue<E>
1700451543
1700451544 implements BlockingQueue<E>,java.io.Serializable{
1700451545
1700451546 //容纳元素的数组
1700451547
1700451548 private final E[]items;
1700451549
1700451550 //元素数量计数器
1700451551
1700451552 private int count;
1700451553
1700451554 public boolean add(E e){
1700451555
1700451556 //调用offer方法尝试写入
1700451557
1700451558 if(offer(e))
1700451559
1700451560 return true;
1700451561
1700451562 else
1700451563
1700451564 //写入失败,队列已满
1700451565
1700451566 throw new IllegalStateException(“Queue full”);
1700451567
1700451568 }
[ 上一页 ]  [ :1.700451519e+09 ]  [ 下一页 ]