消费者和生产者
消费者只管消费的问题
-
缓冲区中的十个鸡笼中有鸡就消费
-
十个都没有就停止消费给生产者信号让他生产,只要有产品我立马又消费
生产者只管生产的问题
-
如果缓冲区的十个鸡笼不是全满我就去生产
-
如果全满了我就释放停止生产的信号
this.wait():自己停止活动,等待其他线程释放开始竞争执行任务的信号
this.notifyAll():通知所有其他线程可以开始竞争执行任务
public class TestPC {
public static void main(String[] args) {
SynContainer synContainer=new SynContainer();
new Productor(synContainer).start();
new Consumer(synContainer).start();
}
}
//产品
class Chicken{
int id;
public Chicken(int id){
this.id=id;
}
}
//生产者
class Productor extends Thread{
SynContainer synContainer;
public Productor(SynContainer synContainer){
this.synContainer=synContainer;
}
@Override
public void run() {
//i是编号
for (int i = 0; i < 100; i++) {
synContainer.push(new Chicken(i));
System.out.println("生产了"+i+"只");
}
}
}
//消费者
class Consumer extends Thread{
SynContainer synContainer;
public Consumer(SynContainer synContainer){
this.synContainer=synContainer;
}
@Override
public void run() {
for (int i = 0; i <100; i++) {
System.out.println("消费了----"+synContainer.pop().id+"只鸡");
}
}
}
//缓冲区
class SynContainer{
Chicken []chickens=new Chicken[10];//容器的大小
int count=0;
//生产者生成鸡
public synchronized void push(Chicken chicken){
//如果容器满了,就需要等待消费者消费
if(count==chickens.length){
//通知消费者消费,通知生产者等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/*哪个位置空了就生成一只鸡放到这个位子让别人买
这个鸡有生产标号id,表示这个鸡是生产者生产的第几只鸡
*/
chickens[count]=chicken;
count++;
//只要有生产就说明鸡笼有鸡,通知消费者可以消费了
this.notifyAll();
}
//消费者消费产品
public synchronized Chicken pop(){
//判断是否可以消费
if(count==0){
//通知生产者生产,消费者等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果可以消费
count--;
Chicken chicken=chickens[count];
//只要有消费就说明此时鸡笼不满,就通知生产者生产
this.notifyAll();
return chicken;
}
}