Как уничтожить экземпляр Java ScriptEngine?

Я использую Java 8. Я не эксперт по Java (не смотрел на Java с колледжа 10 лет назад)

Я создаю экземпляр ScriptEngine (Nashorn, если это имеет значение). Я использую его для оценки нескольких файлов javascript.

Скрипт вполне счастливо работает в своем собственном маленьком мире javascript. Я люблю это.

У меня также запущен File System WatchService на случай, если некоторые из моих java-скриптов будут изменены. Когда они изменяются, я создаю новый ScriptEngine и оцениваю новые версии файлов javascript, используя новый объект ScriptEngine.

Моя проблема в том, что я не могу «убить» старый scriptEngine, как только создам новый. Старый скрипт продолжает работать бесконечно.

Я действительно хочу освободить ресурсы, используемые старым объектом scriptEngine. И я хочу, чтобы он перестал делать то, что он делает (поскольку он может конфликтовать с новым экземпляром, если они оба попытаются сделать одно и то же).

Итак... Как мне полностью удалить старый ScriptEngine, включая любые потоки, порожденные внутри него?


person Brent Larsen    schedule 07.08.2014    source источник
comment
Попробуйте использовать утилиты параллелизма вместо сырых тем.   -  person McDowell    schedule 15.08.2014
comment
Вы когда-нибудь находили способ? Мне кажется, что это дыра в API скриптового движка.   -  person T.J. Crowder    schedule 23.09.2016
comment
@T.J.Crowder Я полностью отказался от проекта из-за этого критического недостатка.   -  person Brent Larsen    schedule 30.03.2017
comment
@BrentLarsen: Вау. Ой. Спасибо, что дали мне знать.   -  person T.J. Crowder    schedule 30.03.2017


Ответы (1)


Хорошо, старая проблема с просачивающимися нитями. У вас есть ручка нити? Что-то наследует Thread? Хорошо, тогда как-то так:

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

Может быть, это помогает.

person atmin    schedule 07.08.2014
comment
потоки создаются в файле javascript, используя что-то вроде этого... (new Thread(function() {...})).start(); Я потенциально мог бы создать большой массив всех порожденных потоков, если бы это помогло. - person Brent Larsen; 07.08.2014
comment
Я действительно предпочел бы убить их на стороне Java моего приложения (а не внутри части JS приложения), поскольку я контролирую сторону Java. Я действительно надеялся найти способ просто отключить скриптовый движок, чтобы он освободил все, что с ним связано. Я не хочу доверять создателям скриптов, чтобы они убирали за собой, чтобы мое приложение было надежным. - person Brent Larsen; 07.08.2014
comment
Можете ли вы добавить потоки в группу потоков? Это делается в конструкторе Thread. Тогда вы можете убить все потоки сразу. - person atmin; 07.08.2014
comment
Цель использования механизма сценариев заключалась в том, чтобы позволить другим людям делать все, что они хотят, внутри сценариев, не нарушая работу Java-приложения. И у меня нет контроля над тем, что они решают делать там внутри. Я мог бы (потенциально) создать хороший маленький класс ThreadSpawner и потребовать, чтобы они использовали его или не получали никакой помощи, если их вещи сломаются. Но на самом деле речь идет не только о потоках, когда срок действия ScriptEngine истекает, я хочу, чтобы все, что с ним связано, было очищено, а вся память и другие ресурсы стали доступны для других вещей. - person Brent Larsen; 07.08.2014
comment
Ну, я провел некоторые расследования, но без особого успеха. Последний подход может состоять в том, чтобы использовать clearInterval для JavaScript (если это возможно с Nashorn). Но опять же должен быть сигнал. Извините, кажется, я здесь. Удачи. - person atmin; 07.08.2014
comment
Кажется, что даже без потоков нет способа уничтожить Engine. Если пользователь запускает while true { print "LOL" }, похоже, нет никакого способа уничтожить движок и остановить его выполнение? - person Josh Wulf; 01.03.2017