2015-03-10 2 views
0

У меня есть приложение, которое запускает тестовый прогон JUnit с некоторыми тестами, которые создают несколько пулов потоков фиксированного размера, не закрывая их потом. Это приводит к тому, что работники пула потоков, от которых мне нужно избавиться. Я не контролирую тестовый код, а только код, запускающий тестовый прогон. Есть ли какой-либо способ (безопасный или небезопасный), который я могу заставить рабочие потоки отключиться?Прерывание пустых работников пула потоков

Мой текущий, нерабочим, попытка решения выглядит следующим образом:

Set<Thread> threads = Thread.getAllStackTraces().keySet(); 
for (Thread thread: threads) { 
    if (thread.getName().matches("pool-\\d+-thread-\\d+")) { 
     thread.interrupt(); 
    } 
} 

Я хотел бы решение, в котором я все еще могу запустить тесты в одной и той же виртуальной машины Java. Нерест отдельный процесс является последним средством на этом этапе.

Редактировать: У меня нет способа получить ссылку на ExecutorService, которая породила рабочие потоки (они созданы в тестовом коде, который я не контролирую).

+0

Нити должны иметь какую-то политику, чтобы заставить их закрыться. Прерывание! = Обязательно. Лучшее, что нужно сделать, - это найти документы для любых потоков, которые создадут потоки, и посмотреть, что это за политика выключения. вызовите метод уничтожения или выключения. –

ответ

0

Если вы используете ExecutorService для того, чтобы начать создавать темы, то вы можете использовать shutdownNow, а затем awaitTermination. Связанные javadocs содержат пример кода для упорядоченного выключения.

+0

Это не помогает, так как у меня нет ссылки на ExecutorService. – user11171

+0

ExecutorService reference = Executors.newSingleThreadExecutor(); – Warkst

+0

@Warkst Да, это в значительной степени то, что делает тестовый пример, но я не могу получить доступ к ссылке вне теста, и я не могу редактировать тест. – user11171