【发布时间】:2014-12-19 11:11:34
【问题描述】:
这是一个消费者-生产者问题,我希望得到如下输出:
看跌:0
获取:0
放:1
获取:1
....等等。
但与此相反,尽管使用了 wait() 和 notify() 方法,但 Consumer 类多次消耗相同的 q 值。以及 Producer 类超出了消费者。如何获得同步输出?
这是 QFixed 类:(它定义了 put() 和 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");
}
}
}
【问题讨论】:
-
请修复您代码中的编译错误,您的代码看起来不错..
-
如何修复编译错误??
-
您向我们展示的代码不能是您正在执行的代码。
new Q()Q 的类。 -
@JainamJhaveri - 你已经编写了程序。如何修复编译错误是什么意思?。你的班级名称是错误的..纠正他们..
标签: java multithreading producer-consumer thread-synchronization