Завершить не отвечающий поток - PullRequest
3 голосов
/ 27 сентября 2010

Я создал приложение Java, и у меня есть поток, который делает что-то в фоновом режиме, когда нажата кнопка.Проблема в том, что поток может заблокироваться, возможно, из-за бесконечного цикла.Есть ли способ, которым я могу принудительно прекратить этот поток?

РЕДАКТИРОВАТЬ: я использую LuaJ на платформе Java.У него есть потенциал блокировки, и я не особо контролирую его, за исключением того, что запускаю его в другом потоке и убиваю его, когда java или скрипт завершены.

Ответы [ 2 ]

6 голосов
/ 27 сентября 2010

Нет, нет.Ваш единственный выбор без большого колдовства - вызвать interrupt () и дождаться, пока он не вызовет блокирующий вызов.В этот момент он сгенерирует исключение InterruptedException, которое должно иметь место для завершения потока.

Если он находится в цикле, таком как while(1);, вы не сможете сделать многое;вам нужно исправить свою ветку, чтобы она этого не делала, или хотя бы проверить флаг и остановить себя.

Например, вы можете переписать:

while(1) {
    doWork();
}

как:

class Whatever {
    private volatile boolean stop = false;
    ...
        while (!stop) {
            doALittleWork();
        }
    ...
}

Раньше был метод Thread.stop(), который делает это, но не рекомендуется по очень-очень веским причинам и не должен использоваться.

РЕДАКТИРОВАТЬ: Поскольку вы, по-видимому, запускаете интерпретатор, вам нужно подключиться после выполнения каждого оператора (или около того) и проверить свою волшебную переменную stop и, если это так, прекратить выполнение Lua.С другой стороны, у среды выполнения Lua может быть свой собственный флаг завершения, который вы можете использовать - я искал документацию, но их сайт ужасен, поэтому вам, возможно, придется взглянуть на код для этого.

Помимо этого, вывозможно, придется добавить исправления в источник Lua4j вручную, чтобы добавить эту функцию.Ваши возможности довольно ограничены, и в конечном итоге Нить должна каким-то образом управлять своей собственной судьбой.

0 голосов
/ 27 сентября 2010

Наконец, с выпуском Java V5.0 (или V1.5), который включает java.util.concurrent , можно дать окончательный ответ. Ответ в том, что вы останавливаете поток, используя interrupt () .

...