2011-05-05 54 views
2

我正在构建一个javascript api,将使用mozilla rhino调用一些java对象。与mozilla犀牛和内存管理问题的Java脚本

一切都很好,但我想避免无限循环,这可能会减慢我的Java应用程序。

例如(在JavaScript):

while(true) doSomething(); // doSomthing will call a method in java 

在现代浏览器在一定的时间出现错误,告诉脚本正在运行缓慢的应用程序,如果我想继续和停止脚本之后。

我想在我的Java应用程序上实现这个功能,但如果可能的话,但我不知道如何实现。 我能想到的唯一解决方案是计算每秒调用的方法数量,以及是否有大量的数据停止脚本。你还有其他建议吗?

+0

我不明白什么 - 你是否真的需要不断地调用这个方法?或者你是否试图实施某种超时机制,如果执行时间超过N秒,就会取消'doSomething()'? – 2011-05-05 14:06:25

+0

@matt b javascript代码部分将不会由我执行。它将由第三方开发者提供。我想要的不是给他们完全的自由,因为我的java应用程序实际上是一个基于服务器的应用程序,而且我不想减慢我的机器。 – 2011-05-05 15:13:38

回答

1

计数的方法调用不会对代码的工作,不调用任何方法,如:

while (true) { 
    i++; 
} 

认为你想要的是observeInstructionCount().也看到discussion here什么 - 一些东西,他们正在讨论看起来有点不对劲,但它可能会帮助你。

+0

哦,是的。这就是我一直在寻找的。谢谢 – 2011-05-05 15:23:41

0

如果你可以使应用程序多线程,你可以派生一个新的线程处理来自JavaScript的每个调用。在线程的开始处记录开始时间,并创建一些超时逻辑来处理。

public void doJavaScript() { 
     final long start = System.currentTimeMillis(); 
     final long timeout = 1000; 
     new Thread(){ 
      @Override 
      public void run() { 
      while ((start + timeout) < System.currentTimeMillis()) { 
       ... do work ... 
      } 
      } 
     }.start(); 
    }