Что мне интересно, так это то, что если несколько потоков ожидают сигнала notEmpty. Что происходит в этом случае и какой поток запущен?
Поскольку другие уже ответили, вы не можете знать, какая нить будет запущена.
так что я думаю, что этот подход работает только для двух потоков?
Зависит от того, что означает этот подход. Часто имеет смысл иметь несколько потоков, ожидающих одного и того же условия. Хитрость в том, что, поскольку вы не можете знать, какой поток будет пробужден, вы должны написать свой код таким образом, чтобы он не имел значение , какой поток был пробужден.
Это пример хорошей практики, которой вы должны следовать при написании многопоточного кода, а именно: когда есть работа, которая должна быть выполнена, не должно иметь значения, какой поток выполняет работу.