防止java中的无限循环

时间:2014-01-08 09:50:13

标签: java frameworks infinite-loop

我想用Java制作像机器人战争这样的小游戏。

我的想法是扩展我的类Robot,使用自定义规则,添加它。

然而,我有这样的事情,我想阻止程序员做,如无限循环。

我知道有些编译器会抱怨如果有无限循环,在Methode中需要返回值。但是我不认为所有的编译器都会在这个问题上返回错误,所以我在想是否有办法以另一种方式检查?

或者可能是对方法进行某种超时的方法?

更新 回想一下我差不多3年半前发布的这个问题,我不再用Java编程,但仍然是一个活跃的程序员,多年来,我了解到如果没有警察第三方代码是多么困难审查周期已实施。 没有简单的方法来检查代码是否是恶意的(这就是为什么我们有反病毒程序)。

为了做我想做的事情,我首先需要控制我正在开发的整个平台,检查代码的行为原因,这个任务几乎是不可能的或太时间 - 耗时。

这就是为什么要更安全地执行此操作,我达成的解决方案是使用脚本语言,将用户限制在您想到的想法中。

在服务器上托管程序,每个人都有权添加代码,这根本不是一个好主意。即使管理程序语言不是Java和CIL,因为平台没有检查这些细节,只需花费太多精力就可以做到这一点。

尽管有一种方法可以使用Sandbox" Java中的程序,使用Policies 和C#有something similar,它永远不会阻止熟练的程序员利用或做一些从未想过的事情。

我希望这次更新能给其他人一个警告,因为我注意到这个话题最近被搜索了很多。

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解游戏的背景。但我想通过说你不能阻止某人编写无限循环来开始这个答案,并且一旦它运行就无法阻止无限循环。只要你的所有代码都可以访问,并且你返回了所有代码等等,Java就无法帮助你检测和防止无限循环。

但是,如果您想在一段时间内执行另一个例程并确保再次访问您的线程,那么一种方法是通过Future。

如果允许“其他编码人员”实现Runnable或Callable,则可以使用Future类的get(long timeout, TimeUnit unit)方法使机器人在预定时间段后超时。这将阻止其他线程中的无限循环永远声明您的线程。

但是,重要的是要注意,如果其他机器人具有无限循环,即使在超时后它也可能永远不会停止运行。 Java不保证它可以阻止其他线程。因此,在代码中调用此类例程时,重要的是要知道要调用的内容。

以下是一些使用Future的示例代码。

abstract class Robot implements Runnable {

}

class SampleRobot extends Robot {

    @Override
    public void run() {
        while (!Thread.interrupted()) {

        }
    }

}

class RobotRunner {
    ExecutorService executorService = Executors.newSingleThreadExecutor();

    public void runRobot(Robot robotToRun) throws InterruptedException, ExecutionException {
        Future<?> robotFuture = executorService.submit(robotToRun);
        try {
            robotFuture.get(5, TimeUnit.SECONDS);
        } catch (TimeoutException e) {
            // This is where you would handle the timeout occurring.
        }
    }
}

请记住,您不应期望Java中超时的实时行为。还要记得在使用完ExecutorService后关闭它。