Используйте защищенные блоки для одного производителя - много потребительских приложений - PullRequest
1 голос
/ 26 марта 2011

Следуя этому примеру в руководствах по Java (tm), я реализовал этого базового производителя - одно потребительское приложение в Delphi 2009 (которое ввело блокировки объектов).

Теперь я хотел бынравится расширять его, чтобы более чем один потребительский поток принимал сообщения от экземпляра Drop.По сравнению с примером учебника по Java единственное изменение кода будет в основном методе:

public class ProducerConsumerExample {
    public static void main(String[] args) {

        Drop drop = new Drop();

        (new Thread(new Producer(drop))).start();

        (new Thread(new Consumer(drop))).start();
        (new Thread(new Consumer(drop))).start(); // <--- added
        (new Thread(new Consumer(drop))).start(); // <--- added 
    }
}

Таким образом, класс Drop все равно будет иметь один объект сообщения типа String, и все работающие потребители будут конкурировать за получение доступазаблокировать и обработать данные сообщения.

Внесет ли изменение в этот код риски или это безопасно использовать?

1 Ответ

0 голосов
/ 26 марта 2011

Согласно коду из связанного примера, вы не сможете остановить более одного потребителя. Таким образом, вам нужно либо добавить stop() метод к классу потребителей, либо отправить DONE столько раз, сколько там потребителей.

Кроме этого, нет никаких рисков.

Но если вы хотите увеличить пропускную способность вашего производителя-потребителя, вы можете рассмотреть возможность использования класса, который может содержать более одного значения за один раз - какая-то очередь, например BlockingQueue из JDK. Таким образом, ваши производители и потребители не будут блокироваться так часто, как в этом примере кода.

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