2013-05-20 3 views
4

У меня есть фоновый поток, запущенный в моем приложении, и мне нужно убить его безопасно. Как я могу убить поток в java, кроме использования логического флага? Я прочитал, что больше не могу использовать thread.stop(), поскольку он небезопасен. но есть ли способ сделать это? может кто-нибудь дать мне фрагмент кода для него, пожалуйста?Как убить нить в андроиде?

Благодаря

+1

Почему не работает флаг? Нужна ли нить, чтобы что-то произошло? –

+0

Почему вам не нравится решение булевого флага? – hoaz

+0

Я мог бы использовать булевский флаг для работы. Но я пытаюсь выяснить, есть ли другой способ сделать это? как пример в C# Я думаю, вы можете прервать поток. –

ответ

8

Его никогда не безопасно на любом языке, чтобы убить вас резьбовых не знаю, что нить может делать и в каком состоянии он может оставить позади. Использование метода отмены с проверкой потока, выполняемой по часовой стрелке isCanceled, позволяет потоку управлять собственной безопасностью - он может сделать это только тогда, когда было бы безопасно убить себя или сделать необходимую очистку.

Если вам действительно не нужно убивать нить, но просто хотите дождаться ее окончания, используйте join.

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

+0

Да, вы правы stop() устарели и небезопасны в использовании. Я использовал Boolean, чтобы остановить любые потоки, которые я использовал в своем коде. –

5

Попробуйте использовать что-то вроде

service.getThread().interrupt(); 
service.setThread(null); 

Или

thread.interrupt(); 
thread = null; 
0

Вам нужно, используя флаг. Например:

private boolean isThOn; //flag isThOn 
long delaytime; 
int times; 
... 
new Thread() { 
     public void run() { 
      int i=0; 
      isThOn = true; 
      while (isThOn && i<times) { 
       try { 
        i++; 
        //{...} 
        if (i == times) isThOn = false; 
        sleep(delaytime); 
       } catch (Exception e) {e.printStackTrace();} 
      } 
     } 
}.start(); 
public void cancelthd() { 
    isThOn = false; //whileloop will stop if isThOn = false -> Thread will Terminated befor i = times. 
} 
Смежные вопросы