日期:2014-05-20  浏览次数:20711 次

哪位帮我看下线程问题,为什么运行不出结果的呢
代码都在这儿了,复制运行到Threads包中,运行下就OK了,多谢谢了.



Drop类:


package Threads;
public class Drop {
// Message sent from producer to consumer.
private String message;
// True if consumer should wait for producer to send message
// false if producer should wait for consumer
// to retrieve message.
private boolean empty = true;
public synchronized String take() {
// Wait until message is available.
while (empty) {
try {
wait();
} catch (InterruptedException e) {
}
}
// Toggle status.
empty = true;
// Notify producer that status has changed.
notifyAll();
return message;
}
public synchronized void put(String message){
//wait until message has been retrieved.
while(!empty){
try{
wait();
}catch(InterruptedException e){

}
//Toggle staus.
empty=false;
//store message.
this.message=message;
//Notify consumer that status has changed.
notifyAll();
}
}
}



Producer类:

package Threads;
import java.util.Random;
public class Producer implements Runnable {
private Drop drop;


public Producer(Drop drop) {
this.drop = drop;
}
public void run(){
String importantInfo[]={
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
Random random=new Random();
for(int i=0;i<importantInfo.length;i++){
drop.put(importantInfo[i]);
try{
Thread.sleep(random.nextInt(5000));

}catch(InterruptedException e){

}
}
drop.put("DONE");

}
}





Consumer类:



package Threads;


import java.util.Random;


public class Consumer implements Runnable {
private Drop drop;


public Consumer(Drop drop) {
this.drop = drop;
}


@Override
public void run() {
// TODO Auto-generated method stub
Random random=new Random();
for(String message=drop.take();!message.equals("DONE");message=drop.take()){
System.out.format("MESSAGE RECEIVED:%s%n",message);
try{
Thread.sleep(random.nextInt(5000));
}catch(InterruptedException exception){

}
}
}


}



ProducerConsumerExample主线程类:

package Threads;


public class ProducerConsumerExample {


public static void main(String[] args) {
// TODO Auto-generated method stub
Drop drop=new Drop();
(new Thread(new Producer(drop))).start();
(new Thread(new Consumer(drop))).start();
}


}

------解决方案--------------------
括号错了

public synchronized void put(String message) {
// wait until message has been retrieved.
while (!empty) {
try {
wait();
} catch (InterruptedException e) {

}
}//***这个括号你到下面去了
// Toggle staus.
empty = false;
// store message.
this.message = message;
// Notify consumer that status has changed.
notifyAll();

}