Отладчик Eclipse всегда блокирует ThreadPoolExecutor без какого-либо очевидного исключения, почему?

Я работаю над своими обычными проектами на Eclipse, это приложение J2EE, сделанное с помощью Spring, Hibernate и т.д. Я использую Tomcat 7 для этого (нет особой причины, я не использую какую-либо новую функцию, я просто хотел попробовать). Каждый раз, когда я отлаживаю свое приложение, бывает, что отладчик Eclipse появляется, как будто он достиг точки останова, но это не так, на самом деле он останавливается на исходном файле Java, который равен ThreadPoolExecutor. На консоли нет трассировки стека, она просто останавливается. Затем, если я нажму на резюме, он будет продолжать работать, и приложение будет работать отлично. Это показано в окне отладчика:

Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) 
    ThreadPoolExecutor$Worker.run() line: 912   
    TaskThread(Thread).run() line: 619

Я действительно не могу это объяснить, потому что я вообще не использую ThreadPoolExecutor. Должно быть что-то из Tomcat, Hibernate или Spring. Это очень раздражает, потому что мне всегда нужно возобновлять работу во время отладки.

Любые подсказки?

Ответ 1

Отслеживаемая трассировка стека указывает на то, что в потоке Daemon встречается исключение RuntimeException. Обычно это не сработано во время выполнения, если только оригинальный разработчик не поймал и не обработал исключение.

Как правило, отладчик в Eclipse настроен на приостановку выполнения в месте, где было выбрано исключение, во всех неперехваченных исключениях. Обратите внимание, что исключение может быть обработано позже, ниже в кадре стека и может не привести к завершению потока. Это было бы причиной наблюдаемого поведения.

Конфигурирование поведения Eclipse прост:
Перейдите в Окно > Настройки > Java > Отладка и снимите флажок Приостановить выполнение при неперехваченных исключениях.

Ответ 2

Здесь есть более конкретное решение, которое предотвращает разбиение Eclipse на RuntimeException только на заданный класс.

  • Добавить новую точку останова исключений с точки зрения отладки
  • Перейдите в его свойства
  • Перейдите в Фильтрация
  • В разделе "Ограничить выбранные местоположения" нажмите " Добавить класс"
  • Добавить java.util.concurrent.ThreadPoolExecutor
  • Снимите флажок, что означает, что они будут игнорироваться

Ответ 4

Я заметил, что это часто происходит после изменения файлов сервера (jsp или java), и STS имеет проблемы с перезагрузкой приложения.

Это обычно приводит к перезапуску сервера, чтобы заставить синхронизировать изменения.

После введения JRebel - похоже, он ушел. Итак, я хотел бы думать, что это воспроизводимая проблема в STS, когда в режиме отладки выполняется "горячий" код.

Удалив исходную горячую настройку, она устраняет проблему с ее разбиением внутри класса ThreadPoolExecutor.