Android лучший и безопасный способ остановить поток

Я хочу знать, что это лучший способ остановить поток в Android. Я знаю, что вместо него можно использовать AsyncTask и что метод cancel() . Я должен использовать Threads в своей ситуации. Вот как я использую thread:

 Runnable runnable = new Runnable() { @Override public void run() { //doing some work } }; new Thread(runnable).start(); 

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

Solutions Collecting From Web of "Android лучший и безопасный способ остановить поток"

Вы должны сделать прерывания поддержки потоков. В принципе, вы можете вызвать yourThread.interrupt() чтобы остановить поток, и в вашем методе run () вам нужно периодически проверять состояние Thread.interrupted()

Здесь есть хороший учебник.

Эта ситуация ничем не отличается от стандартной Java. Вы можете использовать стандартный способ остановки потока:

 class WorkerThread extends Thread { volatile boolean running = true; public void run() { // Do work... if (!running) return; //Continue doing the work } } 

Основная идея – время от времени проверять значение поля. Когда вам нужно остановить поток, вы установите значение false. Кроме того, как отметил Крис, вы можете использовать механизм прерывания.

Кстати, когда вы используете AsyncTask, ваш apporach не будет сильно отличаться. Единственное различие заключается в том, что вам придется вызывать isCancel() из вашей задачи вместо специального поля. Если вы вызываете cancel(true) , но не реализуете этот механизм, поток все равно не остановится сам по себе, он будет работать до конца.

На Android такие же правила применяются, как и в обычной среде Java. В Java нити не убиты, но остановка потока выполняется в кооперативном режиме . Поток просят завершить, и поток может затем закончить работу.

Часто используется volatile boolean поле, которое поток периодически проверяет и завершает, когда оно установлено на соответствующее значение.

Я бы не использовал boolean для проверки завершения потока. Если вы используете volatile в качестве модификатора поля, это будет работать надежно, но если ваш код станет более сложным, вместо использования других методов блокировки внутри цикла while может случиться так, что ваш код не завершится вообще или, по крайней мере, займет больше времени Как вы, возможно, захотите.

Некоторые блокирующие библиотечные методы поддерживают прерывание.

Каждый поток имеет уже булевский флаг, и вы должны его использовать. Он может быть реализован следующим образом:

 public void run() { try { while(!Thread.currentThread().isInterrupted()) { // ... } } catch (InterruptedException consumed) /* Allow thread to exit */ } } public void cancel() { interrupt(); } 

Исходный код, взятый из Java Concurrency на практике . Поскольку метод cancel() является общедоступным, вы можете позволить другому потоку вызывать этот метод по своему усмотрению.

Также interrupted слабо названный статический метод, который очищает прерванный статус текущего потока.

Метод Thread.stop() который может использоваться для остановки потока, устарел; Для получения дополнительной информации см. Почему Thread.stop, Thread.suspend и Thread.resume устарели? ,

Лучше всего иметь переменную, с которой сам поток справляется, и добровольно выходит, если переменная равна определенному значению. Затем вы будете манипулировать переменной внутри своего кода, когда хотите, чтобы поток вышел. Альтернативно, конечно, вы можете использовать AsyncTask .

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

Добавляя что-то к ответу Мэтта, мы можем вызвать interrupt() но это не останавливает поток … Просто сообщает системе остановить поток, когда система хочет убить некоторые потоки. Отдых выполняется системой, и мы можем проверить его, вызвав interrupted() .

[Ps: Если вы действительно собираетесь с interrupt() я прошу вас сделать некоторые эксперименты с коротким сном после вызова interrupt() ]

Дело в том, что вам нужно проверить, что нить работает или нет ? Поле:

 private boolean runningThread = false; 

В потоке:

 new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep((long) Math.floor(speed)); if (!runningThread) { return; } yourWork(); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); 

Если вы хотите остановить поток, вы должны сделать следующее поле

 private boolean runningThread = false; 

Внутри любого класса Activity вы создаете метод, который присваивает NULL экземпляру потока, который может использоваться как альтернатива методу амортизации stop () для остановки выполнения потока:

 public class MyActivity extends Activity { private Thread mThread; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mThread = new Thread(){ @Override public void run(){ // Perform thread commands... for (int i=0; i < 5000; i++) { // do something... } // Call the stopThread() method. stopThread(this); } }; // Start the thread. mThread.start(); } private synchronized void stopThread(Thread theThread) { if (theThread != null) { theThread = null; } } } 

Это работает для меня без проблем.