特点:阻塞队列,定义时可给可不给(无界队列)。put函数在超出队列长度就会阻塞,take函数在队列中无数据会阻塞,poll和offer都可以添加超时时间设定,其他队列都介绍过不在此详细叙述了。和其他队列不同点是每个操作队列方法多了First和Last方法,比如putFirst和putLast,因为此队列是双向队列,也就是可以从头插入数据,从头读取数据,也可以头插入尾读取,反之一样。操作都是用锁的,感觉这个队列也比较简单,主要就是双向。
应用场景:想用就用,此队列可以实现先进先出,先进后出都可以。
代码案例:
package com.example.web.web; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; @RestController public class HomeController { @RequestMapping("/index") public String index() throws Exception { LinkedBlockingDeque<String> queue = new LinkedBlockingDeque<>(2); //生产者 new Thread(() -> { try { for (int i = 0; i < 5; i++) { System.out.println("生产者begin"); queue.put("测试数据" + i); System.out.println("生产者end"); } } catch (Exception ex) { System.out.println(ex); } }).start(); //消费者 new Thread(() -> { try { for (int i = 0; i < 6; i++) { System.out.println("==消费者begin"); TimeUnit.SECONDS.sleep(1); String aa = queue.take(); System.out.println("==消费者end" + aa); } } catch (Exception ex) { System.out.println(ex); } }).start(); //主线程也等待下 TimeUnit.SECONDS.sleep(15); return "网站已得到响应"; } }
参考链接:
http://ifeve.com/java-blocking-queue/
https://blog.csdn.net/vernonzheng/article/details/8267541