Как убить поток, который запускает произвольный клиентский код - PullRequest
1 голос
/ 12 октября 2019

Для академических целей (читай: университетский курс) Я создаю приложение, которое загружает и выполняет код, представленный студентами.

Каждый учащийся представляет файл .class, который загружается, создается с помощью отражения и затем выполняется в своем собственном потоке. Пользовательский менеджер безопасности используется для запрета доступа к классам и методам вне белого списка. Что еще возможно, так это бесконечные циклы в студенческом коде. Я хотел бы иметь возможность тайм-аута потоков, выполняющих код студента, и я не могу полагаться на то, что они сами реализуют эту функциональность.

В Java 7 я мог бы использовать Thread.kill (), но этот метод неболее доступный после java 8. Мне понадобится другой способ принудительно уничтожить поток, выполняющий произвольный неизвестный код, который может содержать бесконечные циклы.

Если есть какой-то изящный трюк, о котором я не знаю, пожалуйста, сообщите мне. Большое спасибо.

Редактировать:

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

1 Ответ

1 голос
/ 12 октября 2019

Используйте Future. Запустите код ученика как «Будущее» и укажите время ожидания:

myFuture.get(long timeout, TimeUnit unit);

Если оно истекло, найдите исключение и отмените это будущее:

myFuture.cancel(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...