public class ProducerConsumer {
public static void main(String[] args) {
SyncStack ss=new SyncStack();
Producer p=new Producer(ss);
Consumer c=new Consumer(ss);
new Thread(p).start();
new Thread(c).start();
}
}
class WoTou{
int id;
public WoTou(int id){
this.id=id;
}
public String toString(){
return "WoTou"+id;
}
}
class SyncStack{
int index=0;
WoTou[] arrWoTou=new WoTou[6];
public synchronized void push(WoTou wt){ //必须锁定,如果同时有多个人往里面添加就毁了
if(index==arrWoTou.length){
try{
this.wait(); //当前锁定的对象的线程。锁不在归对象所有
}catch (InterruptedException e){
e.printStackTrace();
}
}
this.notify();
arrWoTou[index]=wt;
index++;
}
public synchronized WoTou pop()throws Exception{ //必须锁定,如果同时有多个人往外面拿就毁了
if(index==0){
this.wait();//等待生产者生产才能继续
}
this.notify();//叫醒一个线程
index--;
return arrWoTou[index];
}
}
class Producer implements Runnable{
SyncStack ss=null;
Producer(SyncStack ss){
this.ss=ss;
}
public void run() {
for(int i=0;i<10;i++){
WoTou wt=new WoTou(i);
ss.push(wt);
System.out.println("生产了: "+wt);
try{
Thread.sleep(1000); //每生产一个睡眠一会
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
SyncStack ss=null;
Consumer(SyncStack ss){
this.ss=ss;
}
public void run() {
for(int i=0;i<10;i++){
WoTou wt=null;
try {
wt = ss.pop();
System.out.println("消费了: "+wt);
} catch (Exception e1) {
e1.printStackTrace();
}
try{
Thread.sleep((int)Math.random()*1000); //每消费一个睡一会
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
主要运用了多线程的知识,synchronized