特点:阻塞队列,无界队列,这个玩意还比较奇怪,特点就是多了transfer和tryTransfer,对了还有getWaitingConsumerCount()和hasWaitingConsumer()连个方法,就是获取是否有等待的消费者。这个玩意我的理解,put和offer效果是一样的都不会阻塞线程,只有transfer方法会阻塞方法,等待有消费者后这个方法才会执行下去,tryTransfer可以设置等待时间。和SynchronousQueue队列非常像,只是SynchronousQueue队列无法存储数据,此队列可以存储数据。
如果A线程调用transfer此线程会阻塞,B线程调用put可以往队列存放数据,这两个线程那个先执行,哪个数据就会被消费线程先消费掉。
应用场景:这玩意我也还不知道那个场景适合,就是调用transfer方法,会等待消费者将队列中的数据消费掉才会执行。不用此方法和一般队列无太大差别,但是网上不少博客说此队列性能高,因为无锁操作都是CAS+自旋实现的。
代码案例:
package com.example.web.web; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.LinkedTransferQueue; import java.util.concurrent.TimeUnit; @RestController public class HomeController { @RequestMapping("/index") public String index() throws Exception { LinkedTransferQueue<String> queue = new LinkedTransferQueue<>(); //生产者 new Thread(() -> { try { TimeUnit.SECONDS.sleep(1); System.out.println("生产者begin1"); queue.transfer("测试数据1"); System.out.println("生产者end1"); } catch (Exception ex) { System.out.println(ex); } }).start(); //生产者2 new Thread(() -> { try { System.out.println("生产者begin2"); queue.put("测试数据2"); System.out.println("生产者end2"); } catch (Exception ex) { System.out.println(ex); } }).start(); //消费者 new Thread(() -> { try { for (int i = 0; i < 2; i++) { System.out.println("==消费者begin"); TimeUnit.SECONDS.sleep(3); String aa = queue.take(); System.out.println("==消费者end" + aa); } } catch (Exception ex) { System.out.println(ex); } }).start(); //主线程也等待下 TimeUnit.SECONDS.sleep(15); return "网站已得到响应"; } }
参考链接:
https://www.2cto.com/kf/201904/805737.html
https://www.cnblogs.com/stateis0/p/9062076.html