Является ли TimerThread причиной DeadLock? - PullRequest
0 голосов
/ 19 сентября 2018

enter image description here

Поток Таймера-2 ожидает 0x00000000e1a23398 и также блокирует 0x00000000e1a23398.Будет ли эта ситуация вызывать взаимоблокировку потока Timer-2?Кто-нибудь может мне это объяснить?

1 Ответ

0 голосов
/ 19 сентября 2018

Это не является свидетельством тупика.

Таймер-2 получил блокировку для объекта TaskQueue и ожидает уведомления об этом же объекте.Действительно, если бы поток не удерживал блокировку в точке, которую он назвал Object.wait(), он получил бы IllegalMonitorStateException.

Я не говорю, что ваше приложение вообще не заблокировано.Однако два потока «Timer-1» и «Timer2-» оба ожидают, когда другие потоки уведомят их.Это не классический тупик, где каждый из двух потоков будет ожидать, пока другой освободит блокировку.


Что еще я могу выяснить?

Ну, судя по коду java.util.Timer:

  • Поток "Таймер-2" просто ожидает следующего запуска таймера.Это абсолютно нормальное поведение для Timer.

  • Поток "Таймер-1" находится в процессе выполнения задачи таймера.Похоже, что он пытается создать соединение NSQ с (предположительно) удаленной службой.Если это блокировка, это, вероятно, означает, что служба, к которой она пытается подключиться, по какой-то причине недоступна.

Не так много можно почерпнуть из дампов стека.... не копаясь в исходном коде "com.trendrr.nsq".


Есть ли какая-нибудь идея, которая может быть использована для поиска причины?

  1. Посмотрите файлы журналов.
  2. Проверьте настройки (или что-то еще), чтобы выяснить хост / порт службы, к которой он пытается подключиться.
  3. Убедитесь, что служба запущена
  4. Убедитесь, что она доступна с клиента
  5. Глубокое погружение исходного кода
  6. Отладка, почесать голову и так далее.
  7. В крайнем случае нанять консультанта.
...