Ваша проблема - это совокупность проблем.
Во-первых, ваш код получает две блокировки для каждого метода - одну в стеке и одну в списке. Когда вызывается «wait», тот, кто находится в стеке, освобождается, а тот, что в списке, - нет. Это предотвратит выполнение любых других методов. Это фактически тупик. (Спасибо, Питер Лори)
Во-вторых код:
if (list.size() <= 0) {
wait();
}
приведет к тому, что попытка всплывающего окна будет ждать нажатия, прежде чем продолжить. Это может показаться тупиковым, но на самом деле это просто ожидание. Однако звонок
уведомить ();
разбудит только одну нить. Если более одного потока ожидает появления, все, кроме одного, продолжат ожидание. Это похоже на тупик (хотя технически это не так).
Исправления, которые вы должны сделать с этим кодом:
- избавиться от двойной синхронизации. Вам нужен либо метод синхронизации, либо синхронизация (список), а не оба.
- используйте «notifyAll () вместо« notify () »и соедините его с использованием« while »вместо« if »во время ожидания.
Также гораздо более нормально, чтобы стек выдавал исключение, если на нем нет элементов, вместо того, чтобы ждать нажатия.