题目大意 :
我有生产者和消费者 。规定我只有一个盘子 ,要求生产者生产完毕,消费者才能去消费。消费者消费完毕,生产者才能去生产。
且开始时必须要求是生产者先进行生产
消费者:
package com.candp;
public class Consumer implements Runnable{
public Goods good;
public Consumer(Goods good1) {
this.good = good1;
}
@Override
public void run() {
while(true) {//模拟线程不断执行
synchronized(good) {
if( !good.flag) {//若flag为true,说明我的盘子里面已经有东西
try {
good.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
System.out.println("消费水果需要1S");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("消费者消费了 "+ good.get());
//此时我已经消费完毕,我需要将盘子置为空
good.flag = false;
good.notify();//唤醒等待线程
}
}
}
}
生产者
package com.candp;
public class Product implements Runnable{
public Goods good ;
public Product(Goods good1) {
this.good = good1;
}
int i = 0;
@Override
public void run() {
while(true) {
synchronized(good) {
if(good.flag) {//若为true,说明我盘子里面有东西,生产者需要进行等待
try {
good.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(2000);
System.out.println("生产水果需要2S");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//到这里说明flag为false,生茶者可以进行生产
if(i%2 == 0) {//为偶数时我生产苹果
good.setName("苹果");
}else {
good.setName("香蕉");//为奇数时我生产香蕉
}
System.out.println("生产者生产了"+good.get());
i++;
//我生产完毕了
good.flag = true;//此时我应该将盘子的标记置为true说明盘子里面有东西
good.notify();//若生产者线程在等待我就去唤醒它
}
}
}
}
产品:
package com.candp;
public class Goods {
private String name;//商品的名称
public boolean flag = false;//设置flag
public Goods() {
}
public String get() {
return this.name;
}
public void setName(String name1) {
this.name = name1;
}
}
实现类:
package com.candp;
public class Demo {
public static void main(String[] args) {
Goods good = new Goods();
//创建生产者线程目标执行对象
Product p = new Product(good);
Thread t1 = new Thread(p);
t1.start();
//创建消费者线程目标执行对象
Consumer s = new Consumer(good);
Thread t2 = new Thread(s);
t2.start();
}
}
注 : 使用Runnable实现类去共同竞争资源时。把共享的资源作为对象添加到Runnable实现类里面。这样可以达到资源共享的目的