2012-04-18 3 views
4

У меня есть приложение, где мне нужно вызвать 3 метода в 3 отдельных потоках и убить их потом. Согласно Javadoc, я заметил, что нить stop() и даже destroy() устарела. его, как я начинаю один поток за другим, а затем убиваем аналогично один за другим. Есть ли способ убить нити, потому что я не могу использовать устаревшие методыУбийство нити в java android

Любая помощь очень ценится. Еще раз спасибо

+1

Можете ли вы не просто дождаться их завершения, используя 'Thread.join()'? – hmjd

+2

Сделав шаг назад, вам действительно нужен собственный поток или вы можете использовать пул потоков через [Исполнитель] (http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html)? – weston

+2

... ссылка на исполнитель для Android threadpool: http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html – weston

ответ

3

Вы не убиваете нитки. Вы вызываете Thread.interrupt(), а затем реагируете на состояние interrupted или InterruptedExceptionв пределах потока, который прерывается. Или вы используете флаг volatile. См. the official documentation для получения дополнительной информации.

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

+2

После комментариев, сделанных weston и Joolan, я счел очень важным использовать пул потоков bcause уменьшает накладные расходы начальных потоков один за другим. Я нашел для него хороший пример и приложился к этому, и это будет очень полезно для всех. поэтому вот пример его реализации http://apachejava.blogspot.co.uk/2010/03/java-thread-pool-easy-tutorial.html Я принял ответ Joolans и даже комментарии в Westons помогли мне читать поток – rosesr

0

Прекратить изгоевую нить таким образом, чтобы каждый раз повсюду практически невозможно.

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

public class MyTask implements Runnable { 
    // Set this to true when thread must stop. 
    private boolean mStopRequested = false; 
    public void run() { 
     while (mStopRequested == false) { 
      // ... 
     } 
    } 
} 

Если вы называете 3-библиотеками, которые не обеспечивают такой способ, то вам не повезло, и приходится прибегать к уродливым кладжи. Однажды мне пришлось убить длинный вызов сторонней библиотеки, удалив файл, к которому была обращена библиотека (он выбросил исключение FileNotFoundException и вышел). И это работало только в Unix-системах.

Ваш пробег будет отличаться.

0

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

thread1.join(1); 
thread2.join(2); 
thread3.join(3); 

Вы должны обработать исключение.