Java — программа принудительного закрытия (с запущенными потоками)

В общем
Я хочу иметь возможность закрыть свое Java-приложение, даже если в нем все еще работают потоки (не демоны). Возможно ли это в Java? (Исходя из мира С++, это похоже на основной запрос)

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


person Roee Gavirel    schedule 07.01.2015    source источник
comment
@MarounMaroun System.exit(int) закроет JVM независимо от того, какие потоки запущены.   -  person Guillaume Polet    schedule 07.01.2015
comment
Обратите внимание, что это эквивалентно использованию SIGKILL в этих потоках. Это последняя попытка, и на владельцев этих компонентов нужно кричать.   -  person chrylis -cautiouslyoptimistic-    schedule 07.01.2015
comment
Сообщите своим командам, что неуправляемые потоки не разрешены — им нужно пройти через какой-то ExecutorService. Это может управляться централизованно, например. при спуске.   -  person Thorbjørn Ravn Andersen    schedule 22.11.2015


Ответы (2)


выйти из программы попробуй

 System.exit(0);

и попробуйте

 finalize();

если вы хотите освободить ресурсы

person Oussema Chaabouni    schedule 07.01.2015

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

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

person Stefan    schedule 07.01.2015
comment
(+1) Спасибо, мы фактически начали использовать этот подход несколько дней назад. но я не могу запретить плагинам создавать свои собственные потоки... - person Roee Gavirel; 07.01.2015
comment
С библиотекой манипулирования байтами вы можете! Например. Аспектно-ориентированное программирование позволяет вам нацеливаться на новый Thread(), который вы затем можете изменить на создание исключения во время выполнения. Вероятно, вам нужно сделать это по согласованию со всеми командами. - person Thorbjørn Ravn Andersen; 22.11.2015