wait()和()方法以一种非常低级的方式解决了任务互操作的问题,即每次交互时都需要握手。在许多情况下,你可以瞄准更高的抽象级别,使用同步队列来解决任务协作的问题。同步队列在任何时刻都只允许一个任务插入或移除元素。在java.util..接口中提供了这个队列,这个接口有大量的标准实现。
你通常在实际情况里是可以去使用的, 那个东西它是一个没有界限的队列, 除此之外, 你还可以使用其他的那种类型, 这种别的类型它是具备有固定的尺寸的, 正因为如此, 所以你能够在导致阻塞现象出现之前的这个时间点里面, 往其中放置元素的数量是限定在某个范围内的。
当消费者任务试图从队列里头获取那个对象的时候, 如果此时那个队列里头是空的, 那么这些队列就可以把消费者任务给挂起, 并且等到有更多的元素可用了之后, 再去回复那个消费者任务。阻塞队列可以解决非常大的问题, 而且它的这种方式, 同wait()和()相比的话, 要简单一些也要可靠一些许多。
我们可以考虑这么一种情形, 在这种情形之下存在着一个机器设备, 这个机器设备的运作涉及三个具体的任务活动, 第一个任务是进行吐司面包的制作工作, 第二个任务是在已经做好的吐司面包上面涂抹黄油这种调料, 第三个任务则是在经过前两步处理的基础之上再涂上果酱这一类馅料。
基于上述情况, 我们能够通过安排各个不同处理环节之间的衔接方式来推动整个吐司制作流程的正常开展和运行。
这个程序的运行出来的情况, 也就是它可能会得到的最终答案。
Toast是能够使用枚举类型值的一个非常不错的例子。请注意, 在这个例子里面, 完全没有体现出任何显式的同步操作, 也就是没有去使用像Lock对象那样的东西, 也没有用到关键字来搞同步, 这是为什么呢?
因为同步这件事, 早就被队列和整个系统的设计给隐性管理清楚了, 简单说就是, 在任何一个特定的时间点上面, 每一片Toast都只会由一个单独的任务去做操作, 由于队列存在阻塞的情况, 所以处理的过程就会被自动挂起来或者恢复起来, 你可以清楚地看到这种简化做得是非常明显的, 效果一下子就看出来了。
通过使用显式的等待方法以及调用对应的方法, 类和类之间的耦合情况被彻底消除掉了, 原因是, 每一个类都仅仅是针对自己的通信对象展开交互, 而不会涉及其他无关的类。