是否在不使用中断的情况下正确终止Java可调用线程?

时间:2019-10-20 23:12:23

标签: java multithreading interrupt executorservice

所以让我先描述一下我在做什么。我有一个Web服务器,参赛者可以在其中运行提交的.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)超时,则它将继续使用主线程,但不会终止游戏线程。

0 个答案:

没有答案