以Android环境为例的多线程学习笔记(三)-----------阻塞队列
来源:互联网 发布:如何找到一元包邮 淘宝 编辑:程序博客网 时间:2024/04/27 12:17
对于许多多线程的问题,其实是可以通过使用一个或多个队列以安全的方式将其形式化的,即使用队列可以安全的从一个线程
向另一个线程传输数据。其中阻塞队列就是一种很有用的工具,工作者线程可以周期性的将中间结果存储在阻塞队列中,而其他工作者
线程则可以移出中间结果并进行加以修改,而且在其运行的同时队列还会自动的平衡负载。
-----------YYC
本部分则以用阻塞队列的方式解决生产者和消费者问题来作为具体实例进行说明。生产者线程向队列中插入元素,消费者线程
则从中取出它们,特别是当试图向队列中添加元素而队列已满,或者想从队列中移出元素而队列为空的时候,阻塞队列则会导致当前的
这个队列阻塞。
For Example:
//先定义生产者和消费者类
class Producer implements Runnable { private final BlockingQueue sharedQueue; public Producer(BlockingQueue sharedQueue) { this.sharedQueue = sharedQueue; } @Override public void run() { for(int i=0; i<10; i++){ try { System.out.println("Produced: " + i); sharedQueue.put(i); //如果该队列已满则会自动阻塞该线程 //如果该线程在阻塞的过程中被中断则会发生中断异常 } catch (InterruptedException ex) { Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex); } } }} class Consumer implements Runnable{ private final BlockingQueue sharedQueue; public Consumer (BlockingQueue sharedQueue) { this.sharedQueue = sharedQueue; } @Override public void run() { while(true){ try { System.out.println("Consumed: "+ sharedQueue.take()); //如果该阻塞队列为空则会自动阻塞该线程 } catch (InterruptedException ex) { Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex); break; } } } }
case R.id.button3://阻塞队列实现生产者和消费者模式 BlockingQueue sharedQueue = new LinkedBlockingQueue();//容量没有上界的阻塞队列 Thread prodThread = new Thread(new Producer(sharedQueue)); Thread consThread = new Thread(new Consumer(sharedQueue)); prodThread.start(); consThread.start(); break;在JAVA的concurrent包中其实是提供了阻塞队列的几个变种的,上面的代码中选择的是LinkedBlockingQueue型,这种队列的默认容量是没有
上界的,但是,也可以自己手动的设置最大容量。此外还有LinkedBlockingDeque型这是一个双端队列版本、ArrayBlockingQueue是可以用来设置是否需要公平性的队列、PriorityBlockingQueue是一种带优先级的队列,而不是简单的先进先出的队列,元素会按照他们的优先级顺序被移出,该类型也是没有容量
上限的。
3 0
- 以Android环境为例的多线程学习笔记(三)-----------阻塞队列
- 以Android环境为例的多线程学习笔记(一)------- 线程的创建
- 以Android环境为例的多线程学习笔记(二)-----------------锁和条件机制
- 以Android环境为例的多线程学习笔记(四)----------Callable与Future
- 以Android环境为例的多线程学习笔记(五)------------线程池
- 以Android环境为例的多线程学习笔记———-Callable与Future
- 多线程学习(九)-可阻塞的队列
- CMake学习笔记(三)——以笔者的Robosub竞赛为例
- 从头认识java-17.5 阻塞队列(以生产者消费者模式为例)
- Java学习笔记(82)-----------阻塞队列
- 阻塞队列Qeue在take的状态下推出多线程循环(笔记)
- 关于Java多线程和并发运行的学习(五)——阻塞队列
- 学习java多线程的笔记3-使用BlockingQueue阻塞队列来模拟两个线程之间的通信
- UNIX环境编程学习笔记(28)——多线程编程(三):线程的取消
- android游戏编程的学习笔记(以植物大战僵尸等游戏源代码解析为例)
- Android线程—多线程之阻塞队列
- Android开发环境配置(以windows为例)
- cocos2d-x学习笔记(三)让精灵按照自己设定的运动轨迹行动(曲线移动)。(以椭圆轨迹为例)。
- 关于苹果审核相关
- 为什么产品经理要做市场调研
- AppWidget3
- Sco-Unix调试工具dbx使用方法
- 崩溃的Report Builder 报表乱码问题
- 以Android环境为例的多线程学习笔记(三)-----------阻塞队列
- Android中当前墙纸Wallpaper存放的位置
- 如何正确读取jar包src下的文件
- 获取返回的压缩数据流
- 读TCP有感-原来TCP以下都是不可靠地
- Phonegap 打开手机浏览器
- 发现一个规律:如果google上搜不到程序报错原因,意味着隐藏着一个非常2B的bug
- APP快速通过苹果AppStore审核九大诀窍
- js下调用动态显示当前时间(兼容ie和火狐)