JAVA多线程同步问题(3个生产者,2个消费者)
class CubbyHole {
int num;
boolean key=false;
public synchronized int get(){
while(!key){
try{
wait();
}catch(InterruptedException e){}
}
key=false;
notify();
return num;
}
public synchronized void put(int i){
while(key){
try{
wait();
}catch(InterruptedException e){}
}
num=i;
key=true;
notify();
}
}
class Producer extends Thread{
int n1;
private CubbyHole ch;
public Producer(CubbyHole c,int num ){
ch=c;
this.n1=num;
}
public void run(){
for(int k=0;k<3;k++){
int i=(int)(Math.random()*100+1);
ch.put(i);
System.out.println("Producter"+n1+" put"+i);
try{
sleep((int)(Math.random()*100));
}catch(InterruptedException e){}
}
}
}
class Consumer extends Thread{
private CubbyHole ch;
public int n2;
public Consumer(CubbyHole c ,int num){
ch=c;
this.n2=num;
}
public void run(){
int value=0;
for(int k=0;k<3;k++){
value=ch.get();
System.out.println("Consumer"+n2+" get"+value);
try{
sleep((int)(Math.random()*100));
}catch(InterruptedException e){}
}
}
}
public class Test {
public static void main(String[] args) {
CubbyHole ch=new CubbyHole();
Producer p1=new Producer(ch,1);
Producer p2=new Producer(ch,2);
Producer p3=new Producer(ch,3);
Consumer c1=new Consumer(ch,1);
Consumer c2=new Consumer(ch,2);
p1.start();
p2.start();
p3.start();
c1.start();
c2.start();
}
}
==================
有的时候会输出这样的情况:
Consumer2 get83
Producter2 put83
Consumer1 get13
Producter3 put35
Producter1 put13
Consumer2 get35
Producter3 put27
Producter1 put36
Consumer2 get27
Consumer1 get36
Producter2 put20
Consumer1 get20
Producter3 put76
消费者的get却先输出了,请问是哪里出错了?