这篇文章主要为大家展示了“java中TransferQueue的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java中TransferQueue的示例分析”这篇文章吧。
TransferQueue
TransferQueue(java7引入)继承了BlockingQueue(BlockingQueue又继承了Queue)并扩展了一些新方法。生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费(不仅仅是添加到队列里就完事)。
LinkedTransferQueue
LinkedTransferQueue实际上是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集。而且LinkedTransferQueue更好用,因为它不仅仅综合了这几个类的功能,同时也提供了更高效的实现。
对比SynchronousQueue
SynchronousQueue使用两个队列(一个用于正在等待的生产者、另一个用于正在等待的消费者)和一个用来保护两个队列的锁。而LinkedTransferQueue使用CAS操作实现一个非阻塞的方法,这是避免序列化处理任务的关键。
使用场景
当我们不想生产者过度生产消息时,TransferQueue可能非常有用,可避免发生OutOfMemory错误。在这样的设计中,消费者的消费能力将决定生产者产生消息的速度。
实例
public class LinkedTransferQueueDemo { static LinkedTransferQueue<String> lnkTransQueue = new LinkedTransferQueue<String>(); public static void main(String[] args) { ExecutorService exService = Executors.newFixedThreadPool(2); Producer producer = new LinkedTransferQueueDemo().new Producer(); Consumer consumer = new LinkedTransferQueueDemo().new Consumer(); exService.execute(producer); exService.execute(consumer); exService.shutdown(); } class Producer implements Runnable{ @Override public void run() { for(int i=0;i<3;i++){ try { System.out.println("Producer is waiting to transfer..."); lnkTransQueue.transfer("A"+i); System.out.println("producer transfered element: A"+i); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumer implements Runnable{ @Override public void run() { for(int i=0;i<3;i++){ try { System.out.println("Consumer is waiting to take element..."); String s= lnkTransQueue.take(); System.out.println("Consumer received Element: "+s); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
输出
Producer is waiting to transfer... Consumer is waiting to take element... producer transfered element: A0 Producer is waiting to transfer... Consumer received Element: A0 Consumer is waiting to take element... producer transfered element: A1 Producer is waiting to transfer... Consumer received Element: A1 Consumer is waiting to take element... Consumer received Element: A2 producer transfered element: A2
以上是“java中TransferQueue的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。