Правильно ли завершать вызываемую нить Java без использования прерываний? - PullRequest
0 голосов
/ 21 октября 2019

Итак, позвольте мне сначала описать, что я делаю. У меня есть веб-сервер, на котором участник может запустить отправленный файл .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) продолжит работу с основным потоком, если истечет время ожидания, но не прервет поток игры.

...