2014-01-08 86 views
0

我想在Java中制作一个类似机器人大战的小游戏。防止java中的无限循环

的想法是扩展我的类机器人,用自定义规则,你添加到它。然而,我有这样的事情,我想阻止编码器做,就像无限循环一样。

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

或者一种方法可以使某种方法超时?

更新: 回首这个问题,我发布了近3年半前,我不再做Java编程,但仍是活跃的程序员,并且随着年龄的增长,我了解到它是多么不容易如果没有实施审查周期,则向第三方代码发送警报。 有没有简单的方法来检查代码是否是恶意的(这就是为什么我们有反病毒程序)。

为了做一件我想做的事情,我首先需要控制我正在开发的整个平台,以检查代码原样运行的原因,这个任务几乎是可以实施的或者是时间过长-consuming。

这就是为什么要更安全地做到这一点,我所达到的解决方案是使用脚本语言,将用户限制在您的想法中。

在服务器上托管一个程序,每个人都可以访问添加代码,这不是一个好主意。即使将程序语言作为Java和CIL管理,由于平台没有检查这些细节,只需要花费太多精力就可以完成。

即使有办法在Java中“沙箱”方案,通过使用Policies 和C#都something similar,它绝不会阻止一个熟练的程序员利用或做一些从来没有打算。

我希望这个更新给了他们正在做的事情的警告,因为我注意到这个话题最近被搜索了很多。

+0

编译器对运行时一无所知。是的,编译器会在可以的时候抱怨无法访问的代码。 –

+0

您可以使用静态计数器变量并通过检查计数器值来中断循环。 –

+0

静态计数器会精确地要求计数器从sinde插件计算,但是如果第三人制作插件,并破坏游戏的想法 – Droa

回答

1

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

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

如果允许“其他编码员”实施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。

+0

谢谢,我正在考虑做同样的事情,我不知道java没有办法强制终止,我想我可能不得不放弃这个,公平的,它从来没有对java的意图以这种方式工作 – Droa

+1

只要正确使用您的合同的每个人都遵守它,就可以确保线程死亡。但是,每个人都需要遵守合同。只要你信任他们这样做,那么它就可以工作。 如果你想在Java中进行更多关于线程终止策略的阅读,这里是我发现的一个非常有用和易于理解的文档http://docs.oracle.com/javase/1.5.0/文档/导向/杂项/ threadPrimitiveDeprecation.html – user3170817