Oracle官方并发教程之Guarded Blocks
多线程之间经常需要协同工作,最常见的方式是使用Guarded Blocks,它循环检查一个条件(通常初始值为true),直到条件发生变化才跳出循环继续执行。在使用Guarded Blocks时有以下几个步骤需要注意:
假设guardedJoy()方法必须要等待另一线程为共享变量joy设值才能继续执行。那么理论上可以用一个简单的条件循环来实现,但在等待过程中guardedJoy方法不停的检查循环条件实际上是一种资源浪费。
注意:一定要在循环里面调用wait方法,不要想当然的认为线程唤醒后循环条件一定发生了改变。
和其他可以暂停线程执行的方法一样,wait方法会抛出InterruptedException,在上面的例子中,因为我们关心的是joy的值,所以忽略了InterruptedException。
为什么guardedJoy是synchronized方法?假设d是用来调用wait的对象,当一个线程调用d.wait,它必须要拥有d的内部锁(否则会抛出异常),获得d的内部锁的最简单方法是在一个synchronized方法里面调用wait。
当一个线程调用wait方法时,它释放锁并挂起。然后另一个线程请求并获得这个锁并调用Object.notifyAll通知所有等待该锁的线程。
当第二个线程释放这个该锁后,第一个线程再次请求该锁,从wait方法返回并继续执行。
注意:还有另外一个通知方法,notify(),它只会唤醒一个线程。但由于它并不允许指定哪一个线程被唤醒,所以一般只在大规模并发应用(即系统有大量相似任务的线程)中使用。因为对于大规模并发应用,我们其实并不关心哪一个线程被唤醒。
现在我们使用Guarded blocks创建一个生产者/消费者应用。这类应用需要在两个线程之间共享数据:生产者生产数据,消费者使用数据。两个线程通过共享对象通信。在这里,线程协同工作的关键是:生产者发布数据之前,消费者不能够去读取数据;消费者没有读取旧数据前,生产者不能发布新数据。
在下面的例子中,数据通过Drop对象共享的一系列文本消息:
Producer是生产者线程,发送一组消息,字符串DONE表示所有消息都已经发送完成。为了模拟现实情况,生产者线程还会在消息发送时随机的暂停。
Consumer是消费者线程,读取消息并打印出来,直到读取到字符串DONE为止。消费者线程在消息读取时也会随机的暂停。
注意:Drop类是用来演示Guarded Blocks如何工作的。为了避免重新发明轮子,当你尝试创建自己的共享数据对象时,请查看Java Collections Framework中已有的数据结构。如需更多信息,请参考Questions and Exercises。
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。
相关文章
- 教程:ORACLE安装和下载指南(oracle下载安装教程)
- Oracle 视图 DBA_STREAMS_TP_PATH_BOTTLENECK 官方解释,作用,如何使用详细说明
- 探索Oracle数据库:找到最佳代理商(oracle数据库代理商)
- Oracle页面管理:简洁直观的操控方式(oracle页面管理)
- 重建Oracle表的正确索引(oracle重建表索引)
- Oracle中实现条件插入的技巧(oracle条件插入)
- 教程Oracle安装及视频教程指南(oracle安装视频)
- 诊断Oracle跟踪诊断法:指导原则与技巧(oracle跟踪)
- 调用Oracle数据库包的简单教程(oracle包的调用)
- 使用简便,快速上手:Oracle 控制台登陆教程(oracle控制台登陆)
- StepbyStep Guide to Downloading Oracle: Get Your Database System Up and Running(oracle下载教程)
- 快速教程:Oracle如何增加列备注(oracle增加列备注)
- 快速教程:轻松删除Oracle监听(如何删除oracle监听)
- 专业化运维:IPCS解决方案升级Oracle数据库(ipcs oracle)
- Oracle学习入门:一步一步实现梦想(oracle学习教程)
- Oracle内存优化精准的计算技术(oracle内存计算方法)
- Oracle实现内存全面优化(oracle内存全面分析)
- Oracle中使用日期字段的简明教程(oracle中的日期字段)
- 变化Oracle数据库中人数类型的变化趋势分析(oracle 人数类型)
- Oracle的神奇作用让任务更加轻松(oracle作文)
- 利用Oracle数据库实现两列数据之间的加减运算(oracle两列之间加减)
- Oracle 下载失败解决方案(oracle下载不成功)
- Oracle XE教程从入门到精通(oracle xe 教程)
- 让你快速掌握Oracle的PDF教程(oracle pdf教程)
- Oracle 10 乱码的噩梦一把怀念的钥匙(oracle 10 乱码)