0

我不知道为什么我的 get 方法不起作用。它返回“”。

我有 Producer 和 Consumer 类,它们使用这个类和 Buffer 接口,它们只有 set 和 get 方法。生产者读取文件,消费者写入另一个文件。生产者和消费者都使用线程。

请帮我。提前致谢。

import java.util.Stack;

public class synchronizedFile implements Buffer {

public Stack<String> StackBuffer = new Stack<String>();

public void set(String value) {

    synchronized (StackBuffer) {
        if (StackBuffer.size() <= 15) {
            StackBuffer.push(value);
            System.out.println(StackBuffer.toString());
            StackBuffer.notifyAll();
            System.out.println("Consumer notify");
        } else {
            try {

                System.out.println("Produser is waitting--------------------------------");
                StackBuffer.wait();
                System.out.println("Consumer tries to write");
                set(value);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

public String get() throws InterruptedException {

    String Flag = " ";
    synchronized (StackBuffer) {
        if (!StackBuffer.isEmpty()) {

            Flag = StackBuffer.firstElement();
            StackBuffer.remove(StackBuffer.firstElement());
            StackBuffer.notifyAll();
            System.out.println("Producer notify");
            return Flag;
        } else {
            StackBuffer.wait();
            System.out.println("Consumer is waitting --------------------");
            get();

        }

    }

    return Flag;

}

}
4

3 回答 3

1

您至少在 get() 方法Flag = get()else分支中缺少 a 。

除了考虑使用 BlockingQueue 之外,还有一些实现java.util.concurrent可以为您完成并发编程的繁重工作。使用低级构造wait并且notify容易出错。如果不彻底检查,如果您的实施正确,我会感到惊讶。

于 2013-02-15T13:50:50.850 回答
1

您等待并通知两种不同的状态:已满和空。因此,您必须使用两个单独的锁定对象。这已经在不久前在这里讨论过了。

基本上,如果您不是为了使用Stack类或某种分配而实现它,请使用 java.util.concurrent 中的 BlockingQueue。

于 2013-02-15T13:54:45.460 回答
0

在这里你get()递归调用但丢弃它的结果:

StackBuffer.wait();
System.out.println("Consumer is waitting --------------------");
get();

类似Flag = get();return get();更合适的东西。

(另外我不确定是否synchronized两次使用doing进入部分wait是否有效。也许是,我只是不确定)。

于 2013-02-15T13:50:33.350 回答