打字猴:1.700451489e+09
1700451489 编写高质量代码:改善Java程序的151个建议 [:1700438204]
1700451490 编写高质量代码:改善Java程序的151个建议 建议129:适当设置阻塞队列长度
1700451491
1700451492 阻塞队列BlockingQueue扩展了Queue、Collection接口,对元素的插入和提取使用了“阻塞”处理,我们知道Collection下的实现类一般都采用了长度自行管理方式(也就是变长),比如这样的代码是可以正常运行的:
1700451493
1700451494 public static void main(String[]args){
1700451495
1700451496 //定义初始长度为5
1700451497
1700451498 List<String>list=new ArrayList<String>(5);
1700451499
1700451500 //加入10个元素
1700451501
1700451502 for(int i=0;i<10;i++){
1700451503
1700451504 list.add(””);
1700451505
1700451506 }
1700451507
1700451508 }
1700451509
1700451510 上面的代码定义了列表的初始长度为5,在实际使用时,当加入的元素超过初始容量时,ArrayList会自行扩容,确保能够正常加入元素。那BlockingQueue也是集合,也实现了Collection接口,它的容量是否会自行管理呢?我们来看代码:
1700451511
1700451512 public static void main(String[]args)throws Exception{
1700451513
1700451514 //定义初始长度为5
1700451515
1700451516 BlockingQueue<String>bq=new ArrayBlockingQueue<String>(5);
1700451517
1700451518 //加入10个元素
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的最大值。
[ 上一页 ]  [ :1.700451489e+09 ]  [ 下一页 ]