這是在其中,我希望得到如下輸出一個消費者 - 生產者問題:
認沽:0
得到:0
認沽:1
得到:1
.. ..等等。
但與此形成對比的是,儘管使用了wait()和notify()方法,但Consumer類仍然多次使用相同的q值,並且生產者類超出了使用者的範圍。我怎樣才能獲得同步輸出?
同步實施:Java的
這是QFixed類:(定義把()和get()方法)
class QFixed{
int n;
boolean valueset = false;
synchronized int get(){
if(!valueset){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("interrupted");
}
}
System.out.println("Got: " +n);
valueset = false;
notify();
return n;
}
synchronized void put(int n){
if (valueset){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("interrupted");
}
}
this.n = n;
valueset = true;
System.out.println("Put: "+n);
notify();
}
}
這ProducerFixed類:
class ProducerFixed implements Runnable{
Q q;
Thread t;
public volatile boolean flag = true;
ProducerFixed(Q q){
this.q = q;
t = new Thread(this,"Producer");
t.start();
}
@Override
public void run(){
int i =0 ;
while(flag){
q.put(i++);
}
}
void stop() {
flag = false;
}
}
這ConsumerFixed類:
class ConsumerFixed implements Runnable{
Q q;
Thread t;
public volatile boolean flag = true;
ConsumerFixed(Q q){
this.q = q;
t = new Thread(this,"Consumer");
t.start();
}
@Override
public void run(){
while(flag){
q.get();
}
}
public void stop() {
flag = false;
}
}
這Producer_Consumer_Fixed類:
public class Producer_Consumer_Fixed {
public static void main(String arg[]){
Q q = new Q();
Producer p = new Producer(q);
Consumer c = new Consumer(q);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
System.out.println("interrupted");
}
p.stop();
c.stop();
try{
p.t.join();
c.t.join();
}catch(InterruptedException e){
System.out.println("interrupted");
}
}
}
請修正您的代碼中的編譯錯誤,您的代碼似乎很好.. – TheLostMind 2014-12-19 11:16:11
如何解決編譯錯誤? – 2014-12-19 11:28:18
您向我們展示的代碼不能是您正在執行的代碼。 '新Q()'< - 您提供的示例中沒有名爲'Q'的類。 – 2014-12-19 11:32:25