Java的等待唤醒机制用于线程之间协作完成任务。
下面是一个厨师与顾客共同完成10碗面的生成与消费的测试案例。
控制器
package cn.edu.Lab;
class Desk {
static boolean mark;//标记,当mark = true时,表明桌上有面
static int counter = 10;//计数器
static Object lock = new Object();//锁对象
}
消费者
package cn.edu.Lab;
class Customer extends Thread {
public Customer(String s) {
this.setName(s);
}
public void run() {
while(true) {
synchronized(Desk.lock) {
if(Desk.counter == 0) break;
//桌上有面,顾客将其吃掉,将标记转换,并唤醒厨师
if(Desk.mark == true) {
Desk.counter--;
System.out.println("顾客吃了一碗面,还剩" + Desk.counter + "碗。");
Desk.mark = false;
Desk.lock.notifyAll();
} else {//桌上无面,顾客等待厨师做面
try {
Desk.lock.wait();
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
}
}
生产者
package cn.edu.Lab;
class Chef extends Thread{
public Chef(String s) {
this.setName(s);
}
public void run() {
while(true) {
synchronized(Desk.lock) {
if(Desk.counter == 0) break;
//桌上无面,厨师将面做好,并完成标记转换和唤醒顾客
if(Desk.mark == false) {
System.out.println("厨师做了一碗面");
Desk.mark = true;
Desk.lock.notifyAll();
} else {//桌上有面,厨师等待顾客吃面
try {
Desk.lock.wait();
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
测试主函数
package cn.edu.Lab;
public class Day1 {
public static void main(String[] args) {
Chef ch = new Chef("厨师");
Customer cu = new Customer("顾客");
ch.start();
cu.start();
}
}