这里是要操作的对象菜
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();
}
}