java阻塞队列以及非阻塞队列
来源:互联网 发布:java布局思想 编辑:程序博客网 时间:2024/05/16 04:58
1.阻塞队列:是线程安全的
队列满后,如果没有消费者消费队列,那么生存者会阻塞,除非通过
blockingQueue.offer("an apple",5,TimeUnit.SECONDS);//队列满了,指定时间后,不再阻塞
对列空了,如果没有生产者生产队列,那么消费者会阻塞,除非通过
blockingQueue.poll(1, TimeUnit.SECONDS); //队列空时,指定阻塞时间后返回,不会一直阻塞
public class BlockQueueDemo { private static BlockingQueue blockingQueue = new LinkedBlockingDeque(2);//使用了CAS,lock以及lock.condition的await(),signal() 有两个condition static class Producer implements Runnable { private String name; public Producer(String name) { this.name = name; } public void run() { try { System.out.println(name + " start produce"); blockingQueue.put("an apple");// blockingQueue.offer("an apple",5,TimeUnit.SECONDS);//队列满了,指定时间后,不再阻塞 System.out.println(name + " end produce"); } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } //To change body of implemented methods use File | Settings | File Templates. } } static class Consumer implements Runnable { private String name; public Consumer(String name) { this.name = name; } public void run() { try { System.out.println(name + " start consumer");// blockingQueue.take(); //队列空了,会一直阻塞, blockingQueue.poll(1, TimeUnit.SECONDS); //队列空时,指定阻塞时间后返回,不会一直阻塞 System.out.println(name + " end consumer"); } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } public static void main(String[] args) { Producer producer1 = new Producer("producer1"); Producer producer2 = new Producer("producer2"); ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(producer1); executorService.submit(producer2); executorService.submit(producer1); Consumer consumer = new Consumer("consumer1"); executorService.submit(consumer); }}
2.非阻塞队列:是线程安全的
public class NoBlockQueue { private static ConcurrentLinkedQueue<Integer> concurrentLinkedQueue = new ConcurrentLinkedQueue<Integer>();//使用了CAS原语 public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(2); executorService.submit(new Producer("producer1")); executorService.submit(new Producer("producer2")); executorService.submit(new Producer("producer3")); executorService.submit(new Consumer("consumer1")); } static class Producer implements Runnable { private String name; public Producer(String name) { this.name = name; } public void run() { for (int i = 1; i < 10; ++i) { System.out.println(name+ " start producer " + i); concurrentLinkedQueue.add(i); System.out.println(name+"end producer " + i); } } } static class Consumer implements Runnable { private String name; public Consumer(String name) { this.name = name; } public void run() { for (int i = 0; i < 10; ++i) { System.out.println(name+" start Consumer " + i); System.out.println(concurrentLinkedQueue.poll()); System.out.println(name+" end Consumer " + i); } } }}
0 0
- java阻塞队列以及非阻塞队列
- JAVA阻塞队列LinkedBlockingQueue以及非阻塞队列ConcurrentLinkedQueue区别
- java阻塞队列与非阻塞队列
- (原创)JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
- JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
- JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
- 等待队列 阻塞非阻塞
- 阻塞队列与非阻塞队列
- 阻塞队列和非阻塞队列
- Java同步队列(非阻塞队列与阻塞队列)——java并发容器
- java 中 阻塞队列 非阻塞队列 和普通队列的区别是什么?
- java 中 阻塞队列 非阻塞队列 和普通队列的区别是什么
- java 中 阻塞队列 非阻塞队列 和普通队列的区别是什么?
- java 阻塞队列
- JAVA 阻塞队列 ArrayBlockingQueue
- Java中的阻塞队列
- java阻塞队列
- Java 阻塞队列 BlockingQueue
- 多线程互斥 基于c++11
- 背包专辑-基础篇(持续更新中)
- GCDObjC
- char*, wchat_t*互转 及 A2T, T2A宏及其实现原理
- c# 实现datagridview 用回车向右移动,到头换行,支持编辑模式
- java阻塞队列以及非阻塞队列
- LeetCode(Remove Duplicates from Sorted List) 两道删除排序链表中重复数字
- asp.net服务器控件生命周期
- 第五周学习内容
- ValueTrackingSlider
- IOS中是使用libcurl注意事项
- poj 2986 A Triangle and a Circle 圆与三角形的公共面积
- SWTableViewCell
- 关于异常的一点点小结