今天来看一个对于多线程来说非常重要,实用的应用:在producer-consumer结构中使用的Guarded Blocks
链接是:http://download.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html
producer-consumer
在进行多线程编程时使用的最多的结构是什么呢?那就是producer-consumer结构,即一个或多个线程produce一个资源,而一个或多个线程消费这个资源。
从后面的FTP传输文件的例子能够很好的理解这种结构,我们姑且继续往下讲。
Guarded Blocks
指当满足一定条件后才会执行的一段代码。
public void guardedJoy(){
while(!joy) {}//简单的loop guard. 它会浪费处理器时间,所以不要这么做!
System.out.println("Joy has been achieved!");
}
在上例中,只有当joy=false时,才会跳出while循环,之后才会执行打印语句。while(!joy){}就是一个Guarded Blocks。
这种应用在程序中比比皆是,但是放在多线程中就引入了更复杂的问题:等待的对象是由其他进程提供的(即有多个线程消费这个资源)。
原文中提到了,while(!joy)会消耗cpu资源,不是一个好的结构。更好的方法是调用Object.wait
to suspend the current thread (这样在等待时,就不会消耗任何资源。直到有其他线程将该线程唤醒). The invocation of wait
does not return until another thread has issued a notification tha