Как мгновенно завершить неконтролируемый скрипт по требованию?

У меня есть графический интерфейс, который напоминает интерпретатор. Он позволяет пользователю написать скрипт на Jython (реализация Python на Java) и запускать его в любое время. Кроме того, я также хочу, чтобы пользователь мог мгновенно завершить прогон, когда захочет.

Дело в том, что я действительно не знаю, как это сделать. Сценарий запускается в другом потоке, но я не знаю никакого безопасного способа остановить/прервать/завершить поток в середине его выполнения, не говоря уже о том, чтобы не знать, что запускается потоком/скриптом (это может быть простой задачей или, может быть, каким-то тяжелым SQL-запросом к БД, а БД — это то, что требует тщательной обработки ресурсов).

Как я могу мгновенно прекратить такой запуск по требованию?


person Eyal Roth    schedule 15.10.2009    source источник


Ответы (1)


К сожалению, нет безопасного способа мгновенно и безопасно завершить поток. Это одна из причин, по которой Thread.stop устарел.

Это сложная проблема, и она действительно зависит от того, как работает ваш поток. Общего решения для всех потоков для этого не существует. Похоже, ваш поток не находится в цикле, поэтому опрос переменной в цикле не подойдет. Но у вас может быть вариант:

MyThread extends Thread {
    PythonProcess p;

    void run() {
        p = startPython();
    }

    void stopMe() {
        p.halt();
    }
}

В крайнем случае вы все еще можете использовать устаревший Thread.stop, но это будет небезопасно, и его следует избегать, если это вообще возможно. Кроме того, возможно, вы можете сделать разветвление процесса и обрабатывать его вручную на уровне ОС, но это не очень похоже на Java.

person Rontologist    schedule 15.10.2009