Правильно синхронизирующий Вектор в потоках 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 или около того, вы должны опубликовать больше кода, чтобы мы могли выяснить, что именно не так.