Такое дело. Есть список с пассажирами, которые ждут, пока каждого разбудит поток. Но когда он ходит по ним в итерации, просыпается только один. Почему?
На картинке ниже в логах видно, что пассажиры с айди 19 и 12 выходят на одном этаже - но сообщает об этом только один пассажир
Как это выглядит в коде:
//смотрим, какие пассажиры доехали
passengerArrived = passengers.stream()
.filter(p -> p.getDestination() == currentFloor)
.collect(Collectors.toList());
//удаляем тех пассажиров, которых мы доставили
passengers.removeAll(passengerArrived);
//"будим" пассажиров, чтобы те вышли
for (Passenger pass : passengerArrived) {
synchronized (pass) {
pass.notify();
}
}
//------------------------
class Passenger {
///some code
@SneakyThrows
@Override
public void run() {
synchronized (this) {
log.info("Passenger {} waiting an elevator...", id);
wait();
log.info("Passenger {} entered elevator!", id);
wait();
log.info("Passenger {} arrived his floor - {}! Good!", id, destination);
}
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей