用点菜和吃菜来做模拟(生产者和消费者的多线程关系)


这里是要操作的对象

class Food {
	//菜名
	private String name;
	//菜是否做好
	private boolean flag = false;


	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	

	/**
	 * 点菜
	 * 如果flag为true,说明客人正在吃上的那一道菜。还没通知上下一道菜,让其等待
	 * 如果flag为false,这里线程睡眠一秒表示做菜需要的时间
	 * 然后将flag置为true,说明菜做好了,通知可以上了(notify)
	 * @param name
	 */
	public synchronized void callFood(String name){
		if(flag){
			try {
				super.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			Thread.sleep(1000);
		} catch (Exception e) {
			e.printStackTrace();
		}
		this.name = name;
		System.out.println("生产菜=" + name);
		flag = true;
		super.notify();
	}
	
	
	
	/**
	 * 上菜
	 * 如果flag为false,表示正在做这道菜。菜还没有做好让其等待
	 * 如果flag为true,可以吃这道菜了
	 * 这里线程睡眠一秒表示吃菜需要的时间
	 * flag置为false表示吃完了。需要下一道菜,然后通知厨房可以上下一道菜了(notify)
	 */
	public synchronized void upFood(){
		if(!flag){
			try {
				super.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			Thread.sleep(1000);
		} catch (Exception e) {
			e.printStackTrace();
		}
		flag = false;
		System.out.println("消费菜=" + name);
		super.notify();
	}
	
}

这里的厨房代表生产者

//厨房
class Maker implements Runnable{
	private Food food;

	public Maker(Food food) {
		super();
		this.food = food;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			this.food.callFood("鸡"+i);
		}
	}
	
}

 这里的客人代表消费者

//客人
class Eater implements Runnable {
	private Food food;

	public Eater(Food food) {
		super();
		this.food = food;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			this.food.upFood();
		}
		
	}
	
}

这里是main方法

public class CustomThreadExample {
	public static void main(String[] args) {
		Food food = new Food();
		Maker maker = new Maker(food);
		Eater eater = new Eater(food);
		new Thread(maker).start();
		new Thread(eater).start();
	}
}
扫描二维码关注公众号,回复: 637805 查看本文章

猜你喜欢

转载自changaiqing.iteye.com/blog/1774444
今日推荐