0

在经典的消费者\生产者线程场景中,我必须为队列使用向量。由于我需要一个线程等待另一个线程,直到向量中有一个元素,我尝试了以下方法:

public synchronized  QueueLine getCustomer(int index)
    {
        while (Customers.isEmpty())
        {
            try 
            {
                wait();
            } 
            catch (InterruptedException e) {}
        }
        return Customers.elementAt(index);
    }

而另一个线程添加到“客户”向量而不是使用通知。我知道我正在做一些事情,因为一旦 notify() 不会影响另一个线程。

4

2 回答 2

1

好吧,这实际上应该有效,并且是实现此功能的常用方法之一(即,如果某些方法不起作用,则可能在您的另一半代码中存在错误,我们在这里看不到)。但实际上没有理由自己实现这样的事情(除了家庭作业;))因为有完美的java并发包,它有几个可能的解决方案来解决这个问题。

您想要的 1:1 实现将是BlockingQueue(它的实现之一 - 选择最适合您的模型的一个)。

如果您确实需要使用自 java 1.2 左右以来已弃用的类,您应该发布更多代码,以便我们找出究竟是什么错误。

于 2011-06-11T22:13:27.157 回答
1

您正在消费者实例上进行同步。我认为您应该在以下位置同步Vector

public QueueLine getCustomer(int index) {
    synchronized (Customers) {        
        while (Customers.isEmpty()) {
            Customers.wait();
        } 
        return Customers.elementAt(index);
    }
}

在生产者中,您应该做同样的事情:在Vector.

于 2011-06-11T22:20:09.527 回答