Использует ли Object.wait и Object.notify непосредственно запах кода? - PullRequest
6 голосов
/ 13 декабря 2011

Это может быть спорным, но я просто понял, что я очень редко использую ждать и уведомить непосредственно. Вместо этого я использую конструкцию более высокого уровня из пакета java.util.concurrent. Существуют ли случаи использования, когда ожидание и уведомление являются единственным решением или они должны использоваться только при создании конструкций более высокого уровня?

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Существуют ли случаи использования, когда ожидание и уведомление являются единственным решением или они должны использоваться только при построении конструкций более высокого уровня?

Они должны использоваться только при создании конструкций более высокого уровнястроит.Если у вас есть случай, когда существующие высокоуровневые конструкции не решают вашу проблему, вы не хотите возвращаться к ожиданию / уведомлению;Вы хотите создать конструкцию более высокого уровня, которая решит вашу проблему.Вы можете реализовать это с помощью wait / notify.

Например, у меня однажды была проблема, которая требовала одновременного выполнения набора задач с иерархическими зависимостями, где условия зависимости включали комбинацию соединения ("и")и дизъюнкция («или»).То есть были случаи, когда условием одной задачи было «Задача A выполнена, а Задача B выполнена», случаи, когда это было «Задача A выполнено или Задача B выполнено», и различные их комбинации (например, «Задача A являетсявыполнено, и либо задача B, либо задача C выполнена ").

Поэтому я написал небольшую служебную библиотеку, которая предоставляла клиентам интерфейс для отправки коллекций задач, помеченных их условиями, и отправил эти задачи в * 1009.* как только их предварительные условия были выполнены, и контролировал завершение задачи, чтобы начать новые приемлемые задачи.Часть этого была реализована с использованием java.util.concurrent (в основном Executor и Semaphore), но другие части задействовали ожидание / уведомление (поток «координатор» уведомляется о завершении задачи с ожиданием / уведомлением).

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

3 голосов
/ 13 декабря 2011

Из моего POV вы абсолютно правы: гораздо лучше использовать конструкции более высокого порядка, такие как из java.util.concurrent. Система ожидания / уведомления подвержена ошибкам, имеет низкий уровень и имеет проблемы (например, пропущенные сигналы - «уведомитель» подает сигнал до того, как «официант» вызывает wait ()).

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

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