Итак, позвольте мне сначала описать, что я делаю. У меня есть веб-сервер, на котором участник может запустить отправленный файл .java, в котором реализован «компьютерный игрок», который может играть против моего «компьютерного игрока» в игре. Их файл должен соответствовать определенным спецификациям, чтобы его можно было должным образом интегрировать в игровую систему, и я нашел способы отлавливать ошибки и отправлять их обратно, чтобы они могли правильно настроить свой файл. (У меня также есть система, которую я могу использовать для проверки импорта исходного файла, чтобы убедиться, что их доступ к функциям ограничен по соображениям безопасности) Одна из проблем, с которыми я сталкиваюсь, это что делать, если их код застрял в цикле илижду ввода. Я запускаю «игру» в другом потоке с помощью ExecutorService и могу использовать awaitTermination () для отображения ошибки, если поток все еще работает через определенное время. Тем не менее, это не приведет к уничтожению потока, просто продолжите работу с основным потоком (и отобразите ошибку), если поток игры не закончен. Как вы можете сказать, я не могу использовать прерывания, так как не могу редактировать представленный код, и цель прерываний состоит в том, чтобы «приятно» закрыть поток. Я понимаю проблемы с принудительным закрытием потока, и Executorservice даже не позволяет мне использовать что-то вроде thread.stop () (что я также понимаю, опасно использовать.) Так что в этой ситуации есть что-то, что я могу сделать, чтобыпринудительно остановить поток, что является приемлемым и не считается устаревшим или опасным?
Game game = new Game(studentPlayer, computerPlayer);
ExecutorService threadPool = Executors.newSingleThreadScheduledExecutor();
Future<Void> future = threadPool.submit(game);
threadPool.shutdown();
try {
if(!threadPool.awaitTermination(2000,TimeUnit.MILLISECONDS)) {
return createErrorHtml("Timeout Error: ", "your player is kaing too long to make a move," +
"ensure that your player is not waiting for input or stuck in a loop", "");
}
future.get();
Вот фрагмент кода. Очевидно, что класс Game не включен, как вы поняли. Ключевым моментом является то, что threadPool.awaitTermination (2000, TimeUnit.MILLISECONDS) продолжит работу с основным потоком, если истечет время ожидания, но не прервет поток игры.