Вы уверены, что поток RelayedMessages-0000000001 получает уведомление? Обычно другие потоки блокируются, поскольку первый поток все еще получает блокировку для <0x12a8f9f8>. Чтобы другие потоки могли получить блокировку, первый поток должен быть удален из списка ожидания и запланирован для повторного запуска, а затем снять полученную блокировку.
Может быть, есть другие потоки, ожидающие того же объекта, которого ожидает первый поток, и когда вы говорите уведомить, эти потоки выбраны для пробуждения. Если это возможно, обязательно используйте notifyAll ().
Также может быть, вы можете снять блокировку до помещения потока в список ожидания или ожидания вызова, указав значение тайм-аута. не имеет смысла, что поток находится в списке ожидания в течение 16 часов. Если вы также можете публиковать другие темы, это также будет полезно.
Обновление:
Вы правы, я должен был принять во внимание Thread.State. Как вы прокомментировали, он не находится в состоянии ожидания, так как он был уведомлен. Нахождение в списке ожидания не является причиной отказа от снятия блокировки <0x12a8f9f8>. Тем не менее, он находится в заблокированном состоянии. Это означает, что он пытается получить блокировку, полученную до object.wait, но не может. Похоже, что есть другой поток (не в том списке, который вы указали), блокирующий его.
Я думаю, вы думаете, object.wait должен был снять блокировку <0x12a8f9f8>. Но object.wait только снимает блокировку на этом объектном мониторе и сохраняет другие блокировки. И я думаю, что блокировка <0x12a8f9f8> не является блокировкой для монитора объекта (для которого вызывается ожидание)
Конечно, это может быть и не так, и может быть действительно ошибка. Я просто пытаюсь найти возможные причины.