Правильно синхронизирующий Вектор в потоках Java

В классическом потребительском \ производственном потоке senario и я должен использовать вектор для очереди. Так как мне нужен один поток для ожидания другого, пока в векторе не появится элемент, я попробовал следующий метод:

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

в то время как другой поток добавляет к вектору "клиентов", а затем использовать уведомление. я знаю, что делаю что-то плохое, поскольку однажды функция notify() не влияет на другой поток.

2 ответа

Решение

Вы синхронизируете на экземпляре потребителя. Я думаю, что вы должны синхронизировать на Vector:

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

В продюсере вы должны сделать то же самое: синхронизировать и уведомлять Vector,

Ну, на самом деле это должно сработать и является одним из обычных методов для реализации этого (то есть, если что-то не работает, возможно, есть ошибка в другой половине вашего кода, которую мы здесь не видим). Но на самом деле нет никакой причины реализовывать что-то подобное самостоятельно (за исключением домашней работы;)), поскольку существует прекрасный параллельный пакет java, в котором есть несколько возможных решений этой проблемы.

Реализация 1:1 того, что вы хотите, будет BlockingQueue (хорошо, одна из его реализаций - выберите ту, которая лучше всего подходит вашей модели).

Если вам действительно нужно использовать класс, который устарел начиная с Java 1.2 или около того, вы должны опубликовать больше кода, чтобы мы могли выяснить, что именно не так.

Другие вопросы по тегам