thread41 - LinkedTransferQueue
2017-06-16 16:07
225 查看
package com.neutron.t22; import java.util.concurrent.LinkedTransferQueue; /** * LinkedTransferQueue * 使用场景消费者线程先启动,生产者去生产首先找有没有消费者,如果有消费者就不扔到队列,直接给消费者 * * 比如玩棋牌类游戏,a发牌后需要通知bcd,那么消息可以发送到队列中,然后通过队列发给bcd,也可以通过LinkedTransferQueue * 如果有消息消费者,直接发给消费者线程即可,而不走消息队列,效率会更加高,支持并发会更高更好 * */ public class T228LinkedTransferQueue { static LinkedTransferQueue<String> queue = new LinkedTransferQueue<>(); /** * 如果单独执行m1方法,那么执行到transfer会阻塞,后面的消费者线程不会启动 */ static void m1() throws InterruptedException { // 如果开始没有找到消费者线程,那么使用transfer会阻塞 queue.transfer("hello"); // 如果使用add、offer、put都不会存在阻塞问题 // 消费者线程启动 new Thread(() -> { try { System.out.println(queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } }, "client").start(); } /** * 如果单独执行m2方法,正常执行 * 先启动消费者线程,那么LinkedTransferQueue会先去找是否有消费者线程,有消费者线程继续执行 */ static void m2() throws InterruptedException { // 消费者线程启动 new Thread(() -> { try { System.out.println(queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } }, "client").start(); // 如果开始没有找到消费者线程,那么使用transfer会阻塞 queue.transfer("hello"); } /** * 注意单独启动m1和m2方法的执行结果 * m2是有效的正常写法,打印出来hello */ public static void main(String[] args) throws InterruptedException { // m1(); m2(); } }
相关文章推荐
- 【死磕Java并发】-----J.U.C之阻塞队列:LinkedTransferQueue
- java LinkedTransferQueue
- Java多线程--并发中集合的使用之LinkedTransferQueue
- JDK容器与并发—Queue—LinkedTransferQueue
- LinkedTransferQueue学习导引 推荐
- Fork/Join模式(JSR166y)手记之TransferQueue/LinkedTransferQueue
- 高并发第十三弹:J.U.C 队列 SynchronousQueue.ArrayBlockingQueue.LinkedBlockingQueue.LinkedTransferQueue
- LinkedTransferQueue
- 3.集合--LinkedTransferQueue学习
- Java 并发 --- 阻塞队列之LinkedTransferQueue源码分析
- 3.集--LinkedTransferQueue得知
- LinkedTransferQueue原理理解
- JUC源码分析25-队列-LinkedTransferQueue
- LinkedTransferQueue 理解
- Bug:LinkedTransferQueue的数据暂失和CPU爆满
- LinkedTransferQueue 用法
- 并发编程—— LinkedTransferQueue
- ThreadPoolExecutor的三种队列SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue
- java队列ConcurrentLinkedQueue的使用
- ConcurrentLinkedQueue的实现原理分析