Прерывание потока против вызова функции JNI - PullRequest
1 голос
/ 17 июня 2011

Я использую метод из принятого ответа здесь, чтобы создать поток игрового цикла.

Где остановить / уничтожить потоки в классе обслуживания Android?

Вв тот момент, когда моя нить в основном получает время, выполняет один вызов Native Function, который обновляет игровую логику, а затем спит в течение установленного времени.

Что мне интересно, так как я все еще не оченькомфортно с потоками, насколько быстро поток убивается с помощью прерывания ()?Если он находится в середине кода, работающего в нативной функции, остановится ли он в середине или будет безопасно завершен?

Заранее спасибо, Иеремия

1 Ответ

3 голосов
/ 17 июня 2011

Не беспокойтесь, в документации для interrupt написано :

Если этот поток заблокирован при вызове wait (), wait (long) или wait(long, int) методы класса Object, или методы join (), join (long), join (long, int), sleep (long) или sleep (long, int), методы этого класса, затем егостатус прерывания будет очищен и получит исключение InterruptedException.

Таким образом, ваш поток получит InterruptedException, только если вы находитесь в состоянии блокировки / ожидания / ожидания.Если вы работаете, поток не получит исключение, пока не войдет в одно из этих состояний.

Ваш цикл должен быть:

while(!Thread.currentThread().isInterrupted()) // <- something of the sort here
{
    try{
        // do work
    } catch (InterruptedException e){
        // clean up
    }
}

Обновление:
Кроме того, документация гласит:

Если не выполняется ни одно из предыдущих условий, будет установлен статус прерывания этого потока.

...