package 生产者与消费者;
public class FoodClass {
//food是共享的资源
private String food;
//当cooker为false,表示锅不是空的
private boolean cooker = false;
public FoodClass() {
}
public synchronized void set(String food) {
if(!cooker) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.food = food;
this.cooker = false;
this.notify();
}
public synchronized void get() {
if(cooker) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(food);
this.cooker = true;
this.notify();
}
}
package 生产者与消费者;
public class SetFoodClass implements Runnable{
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>private FoodClass fc;
<span style="white-space:pre"> </span>private int x = 0;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public SetFoodClass(FoodClass fc) {
<span style="white-space:pre"> </span>this.fc = fc;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void run() {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span>while(true) {
<span style="white-space:pre"> </span>if(x % 2 != 0) {
<span style="white-space:pre"> </span>fc.set("吃饭!!!!!!!!!!!!!!!!!!!!!!!");
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>fc.set("喝粥!");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>x++;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
}
package 生产者与消费者;
public class GetFoodClass implements Runnable{
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>private FoodClass fc;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public GetFoodClass(FoodClass fc) {
<span style="white-space:pre"> </span>this.fc = fc;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public void run() {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span>while(true) {
<span style="white-space:pre"> </span>fc.get();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span>
}
package 生产者与消费者;
public class TestClass {
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>public static void main(String[] args) {
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>FoodClass fc = new FoodClass();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>SetFoodClass sfc = new SetFoodClass(fc);
<span style="white-space:pre"> </span>GetFoodClass gfc = new GetFoodClass(fc);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>Thread th1 = new Thread(sfc);
<span style="white-space:pre"> </span>Thread th2 = new Thread(gfc);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>th1.start();
<span style="white-space:pre"> </span>th2.start();
<span style="white-space:pre"> </span>}
}
主要是锁关键字synchronized和wait()还有notify()的使用,访问同一资源用同一把锁才可以。
后来想使用计时器来实现,可是发现程序却死在那里了,不知道为什么,下次再尝试吧。