2015-01-26 7 views
0

Я создал автоматический набор тестов, в котором пул потоков работает одновременно на фоне всех тестовых примеров, чтобы получить данные о системе и показатели производительности. Каждый поток использует соединение JSch для выполнения своих команд оболочки, и они получают [JSchException: каналы, не открытые исключения].Почему мои потоки не выходят, когда заканчивается тестовый комплект?

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

Когда я проверил дамп потока, я обнаружил, что потоки не выходят из-за того, что они находятся в состоянии BLOCKED.

У кого-нибудь есть объяснение? Или какая-то помощь в решении этой проблемы?

+1

Вы можете опубликовать проверенный код? – maffelbaffel

+1

Потоки, вероятно, просто ждут дальнейшей работы. Вы должны завершить сеанс тестирования явным отключением всех подсистем, которые вы явно начали. –

+0

См. [Блокировка Mutex: что означает «блокировка»?] (Http://stackoverflow.com/questions/3982501/mutex-lock-what-does-blocking-mean). Похоже, ваши темы соперничают для ресурса ... – gknicker

ответ

0

Возможно, вы имеете в виду метод shutdownNow() ExecutorService. Это документация (я форматировал соответствующие части выделены жирным шрифтом):

Попытки остановить все активно выполняющиеся задачи, останавливает обработку ожидающих задач, и возвращает список задач, которые ожидают выполнения.

Этот метод не ждет активных выполнения задач для завершения. Используйте функцию ожидания, чтобы сделать это.

Нет гарантий, не требующих больших усилий, чтобы остановить обработку, активно выполняющую задачи. Например, типичные реализации будут отменены с помощью Thread.interrupt(), поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.

Обрыв нити - это совместный процесс, ваши потоки должны быть реализованы так, чтобы они реагировали на прерывание.

EDIT

1) О Thread.currentThread.interrupt() см этот вопрос: Why invoke Thread.currentThread.interrupt() when catch any InterruptException?

Так что вам нужно сделать, это только если у вас есть другие методы/нить группы смотрят статус прерывания. В вашем случае, вероятно, нет, но это не повредит.

2) Кажется, что в «ShellUtils.executeCommand» вы используете внешние программы. Это может быть источником проблемы, если этот метод не реагирует на прерывания потоков.

+0

В настоящее время я перехватываю InterruptedException в каждом из моих потоков и затем ломаюсь от цикла потока. Недостаточно ли этого, чтобы реагировать на прерывание? Или мне нужно добавить Thread.currentThread.interrupt() в состояние catching? – tmcevoy

+0

I.e while (true) { try { final Строковый вывод = ShellUtils.executeCommand (hostname, COMMANDS) .getStdOut(); final String [] measurement = output.split (Constants.RegularExpressions.NEWLINE); if (измерения.length == METRICS.length) { writeMetricData (измерения); } else { Logger.log (Level.SEVERE, "не удалось выполнить одну или несколько команд"); } Thread.sleep (SLEEP_TIME); } catch (InterruptedException e) { break; } – tmcevoy

+0

Я отредактировал ответ в ответ на ваши комментарии – lbalazscs

Смежные вопросы