如何销毁 Java ScriptEngine 实例?

Posted

技术标签:

【中文标题】如何销毁 Java ScriptEngine 实例?【英文标题】:How do I destroy a Java ScriptEngine Instance? 【发布时间】:2014-10-01 01:05:13 【问题描述】:

我正在使用 Java 8。我不是 Java 专家(自从 10 年前大学以来就没有研究过 Java)

我创建了一个 ScriptEngine 的实例(如果重要的话是 Nashorn)。 我用它来评估几个 javascript 文件。

脚本在它自己的小 JavaScript 世界中非常愉快地运行。我喜欢它。

我还运行了一个文件系统 WatchService,以防我的一些 java 脚本被修改。 当它们被修改时,我创建一个新的 ScriptEngine,并使用新的 ScriptEngine 对象评估新版本的 javascript 文件。

我的问题是,一旦我创建了新的脚本引擎,我就无法“杀死”旧的脚本引擎。旧脚本无限期地继续运行。

我真的很想释放旧 scriptEngine 对象正在使用的资源。而且我希望它停止做它正在做的事情(因为如果他们都尝试做同样的事情,它可能会与新实例发生冲突)。

那么...我如何完全消除旧的 ScriptEngine,包括其中产生的任何线程?

【问题讨论】:

考虑使用the concurrency utilities 代替原始线程。 你找到方法了吗?对我来说,这似乎是脚本引擎 API 中的一个漏洞。 @T.J.Crowder 基于这个关键缺陷,我完全放弃了这个项目。 @BrentLarsen:哇。哎哟。谢谢你告诉我。 【参考方案1】:

好的,线程泄漏的老问题。你有线程的句柄吗?有什么东西继承了线程吗?好的,然后是这样的:

private void stopThread(Thread thread) 
    final Thread moribund = thread;
    if (moribund != null) 
        thread = null;
        moribund.interrupt();
    

也许有帮助。

【讨论】:

线程是在 javascript 文件中使用类似这样的东西创建的... (new Thread(function() ...)).start();如果有帮助的话,我可能会制作一个包含所有衍生线程的大数组。 我真的更喜欢在我的应用程序的 java 端(而不是在应用程序的 JS 部分内部)杀死它们,因为我可以控制 Java 端。我真的很希望有一种方法可以将插件插入脚本引擎,这样它就可以释放与之相关的所有内容。我不想为了让我的应用程序可靠而不得不“信任”脚本的构建者自己进行清理。 您可以将线程添加到线程组吗?它在 Thread 构造函数中完成。然后你可能会一次杀死所有线程。 使用脚本引擎的目的是允许其他人在脚本中“做任何他们想做的事”,而不会破坏 Java 应用程序。而且我无法控制他们决定在里面做什么。我可以(可能)创建一个不错的小 ThreadSpawner 类,并要求他们使用它,或者如果他们的东西坏了就得不到任何帮助。但实际上它不仅仅是线程,当 ScriptEngine 过期时,我希望与它相关的所有内容都被清理,并且所有内存和其他资源都可供其他事物使用。 好吧,我进行了一些调查,但没有取得很大的成功。最后一种方法可能是采用 JavaScript 的“clearInterval”(如果 Nashorn 可以的话)。但话又说回来,应该有一个信号。对不起,我想我在外面。祝你好运。

以上是关于如何销毁 Java ScriptEngine 实例?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rhino 代替 ScriptEngine 在 Java 中运行 Javascript 代码

Java:在应用程序中嵌入脚本引擎:JSR 223 (ScriptEngine) 仍然是一个好的解决方案吗?

java中静态成员变量、实例变量、局部变量何时创建、何时销毁?

[ Java学习基础 ] Java对象的创建和销毁

什么时候/为什么我的Java单例实例被销毁?

如何正确销毁 CKEditor 实例?