ArrayBlockingQueue和LinkedBlockingQueue用法上没有什么区别,因此就放在一块儿把。html
特色:阻塞队列,ArrayBlockingQueue定义时须要给定长度(有界队列),LinkedBlockingQueue定义时可给可不给(无界队列)。put函数在超出队列长度就会阻塞,take函数在队列中无数据会阻塞。offer函数和poll函数不会发生阻塞,有返回参数。add函数在超出队列长度时会报错,remove函数能够移除指定数据。java
区别:ArrayBlockingQueue在添加和取出共用一把锁,而LinkedBlockingQueue是分开的两把锁。另外一个区别看就是一个底层实现是数组一个是单向链表,数组和链表的区别就是数组适合读取,插入和删除都会影响数组中其他元素,链表正好相反,适合插入删除只会影响关联的的一个元素,不适合读取,读取会重头开始读取。web
应用场景:用到队列的场景基本都是这个。spring
代码案例:数组
package com.example.web.web; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.TimeUnit; @RestController public class HomeController { @RequestMapping("/index") public String index() throws Exception { ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(2); //生产者 new Thread(() -> { try { TimeUnit.MILLISECONDS.sleep(5000); System.out.println("生产者begin"); queue.put("测试数据"); //queue.offer("测试数据", 5, TimeUnit.SECONDS); System.out.println("生产者end"); } catch (Exception ex) { } }).start(); //消费者 new Thread(() -> { try { System.out.println("消费者begin"); //String aa = queue.take(); String aa = queue.poll(2, TimeUnit.SECONDS); System.out.println("消费者end" + aa); } catch (Exception ex) { } }).start(); //主线程也等待下 TimeUnit.SECONDS.sleep(10); return "网站已获得响应"; } }
参考连接:app
http://ifeve.com/java-blocking-queue/函数
https://www.cnblogs.com/liqiu/p/3630281.html测试
http://www.importnew.com/24055.html网站