线程怎么乱了,求大家帮我编译运行一下
永生天地 2005-12-20 05:34:52 public class ProducerConsumerTest1{
public static void main(String[] args) {
CubbyHole c = new CubbyHole( ); //store number
Producer p1 = new Producer( c, 1 ); //put number
Consumer c1 = new Consumer( c, 1 ); //get number
p1.start( );
c1.start( );
}
}
class Consumer extends Thread{
private CubbyHole cubbyhole;
private int number;
public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number; //consumer Num
}
public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get( ) ;
System.out.println("Consumer #"+this.number
+ " got: " + value);
}
}
}
class Producer extends Thread{
private CubbyHole cubbyhole;
private int number;
public Producer(CubbyHole c, int number){
cubbyhole = c;
this.number = number; //producer Num
}
public void run( ){ //override the run method
for (int i = 0; i < 10; i++) {
cubbyhole.put( i ); //put i into CubbyHole
System.out.println("Producer #"+this.number
+ " put: " + i);
try {
sleep((int)(Math.random() * 100));
}catch (InterruptedException e) { }
}
}
}
class CubbyHole{
private int contents;
private boolean available = false;
//define get() method used by consumer
public synchronized int get(){ //lock an Object
while (available == false){
try {
wait(); // wait for Producer to put value
} catch (InterruptedException e) { }
}
available = false;
notifyAll();// notify Producer that value has been retrieved
return contents; //return the value to consumer
} // unlock an Object
//define put() method used by producer
public synchronized void put(int value){ // lock an Object
while (available == true) {
try {
wait(); // wait for Consumer to get value
} catch (InterruptedException e) { }
}
contents = value; //put the value
available = true;
notifyAll(); // notify Consumer that value has been set
} // unlock an Object
}
运行结果: 我倒了
Producer #1 put: 0
Consumer #1 got: 0
Consumer #1 got: 1
Producer #1 put: 1
Consumer #1 got: 2
Producer #1 put: 2
Consumer #1 got: 3
Producer #1 put: 3
Producer #1 put: 4
Consumer #1 got: 4
Consumer #1 got: 5
Producer #1 put: 5
Consumer #1 got: 6
Producer #1 put: 6
Consumer #1 got: 7
Producer #1 put: 7
Consumer #1 got: 8
Producer #1 put: 8
Producer #1 put: 9
Consumer #1 got: 9
Press any key to continue...