Java多线程 の等待唤醒机制

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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值