Ожидание при нескольких условиях в Java

#java #multithreading

#java #многопоточность

Вопрос:

Я хочу, чтобы поток ожидал, пока не будет подано любое из двух условий. Возможно ли это?

Предположим, поток обрабатывает входящие пакеты данных, в то время как пользователь, возможно, прерывает работу, изменяя некоторые состояния.

Одно условие сигнализируется при поступлении пакета, а другое сигнализируется при изменении состояний.

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

Ответ №1:

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

Комментарии:

1. Значит, каждый сигнальный поток подает сигналы дважды ( packetCond.signalAll(); packetOrStatesCond.signalAll(); )? Далеко не элегантно, но все равно сработало. Спасибо.

Ответ №2:

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

Комментарии:

1. Это дает вам оба из двух условий. Оператору требуется любое из двух условий.