Существуют ли случаи использования, когда ожидание и уведомление являются единственным решением или они должны использоваться только при построении конструкций более высокого уровня?
Они должны использоваться только при создании конструкций более высокого уровнястроит.Если у вас есть случай, когда существующие высокоуровневые конструкции не решают вашу проблему, вы не хотите возвращаться к ожиданию / уведомлению;Вы хотите создать конструкцию более высокого уровня, которая решит вашу проблему.Вы можете реализовать это с помощью wait / notify.
Например, у меня однажды была проблема, которая требовала одновременного выполнения набора задач с иерархическими зависимостями, где условия зависимости включали комбинацию соединения ("и")и дизъюнкция («или»).То есть были случаи, когда условием одной задачи было «Задача A выполнена, а Задача B выполнена», случаи, когда это было «Задача A выполнено или Задача B выполнено», и различные их комбинации (например, «Задача A являетсявыполнено, и либо задача B, либо задача C выполнена ").
Поэтому я написал небольшую служебную библиотеку, которая предоставляла клиентам интерфейс для отправки коллекций задач, помеченных их условиями, и отправил эти задачи в * 1009.* как только их предварительные условия были выполнены, и контролировал завершение задачи, чтобы начать новые приемлемые задачи.Часть этого была реализована с использованием java.util.concurrent
(в основном Executor
и Semaphore
), но другие части задействовали ожидание / уведомление (поток «координатор» уведомляется о завершении задачи с ожиданием / уведомлением).
Таким образом, код оказался намного проще для понимания и устранения неполадок, и позже мы нашли другие варианты использования той же библиотеки координатора задач.