Когда вы устанавливаете active
в false, вы не даете регистратору достаточно времени, чтобы увидеть это изменение. Он ждет в worker.wait
, когда вы устанавливаете active в false, и переходите к завершению sh программы.
У вас должен быть notify
рабочий, когда вы устанавливаете active:
public void setActive(boolean active) {
synchronized(worker) {
this.active = active;
worker.notify()
}
}
Итак, когда вы меняете активный, worker.wait
уведомляется.
Однако даже при этом есть исполнения, при которых будет напечатан последний журнал, и есть исполнения, при которых последний журнал не будет напечатан, потому что ваша программа может завершиться до того, как рабочий сможет добавить последний журнал. Вам нужна дополнительная синхронизация, чтобы гарантировать это, или вы можете немного подождать, прежде чем вернуться из main.
У вас тоже есть гонка данных. Когда вы добавляете / читаете журналы, вы не синхронизируете доступ к общему списку журналов. Либо синхронизируйте доступ к нему, либо используйте синхронизированную коллекцию для хранения журналов.