这里是要操作的对象菜
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 查看本文章