Правильно синхронизирующий Вектор в потоках Java - PullRequest
0 голосов
/ 12 июня 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 12 июня 2011

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

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

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

1 голос
/ 12 июня 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...