Android最好和安全的方式来停止线程

我想知道哪些是停止Android中的线程的最好方法。 我知道我可以使用AsyncTask而不是它,并且有cancel()方法。 我必须在我的情况下使用线程。 这里是我如何使用线程:

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

所以任何人有任何想法是停止线程的最好方法?

你应该让你的线程支持中断。 基本上,您可以调用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 } } 

主要的想法是时常检查字段的值。 当你需要停止你的线程时,你将running设置为false。 另外,正如Chris所指出的那样,你可以使用中断机制。

顺便说一下,当你使用AsyncTask时,你的apporach差别不大。 唯一的区别是,你将不得不从你的任务调用isCancel()方法,而不是有一个特殊的字段。 如果你调用cancel(true) ,但是不执行这个机制,线程本身不会停止,它会运行到最后。

在Android上,相同的规则适用于普通的Java环境。 在Java中,线程不会被终止,但是线程的停止是以合作的方式完成的 。 线程被要求终止,线程可以正常closures。

通常会使用一个volatile boolean字段,当线程设置为相应的值时,该字段会定期检查并终止。

不会使用boolean来检查线程是否应该终止 。 如果你使用volatile作为一个字段修饰符,这将工作可靠,但是如果你的代码变得更加复杂,为了在while循环内部使用其他的阻塞方法,可能会发生,你的代码将不会终止 ,或者至less需要更长的时间如你所愿。

某些阻塞库方法支持中断。

每个线程已经有一个布尔标志中断状态 ,你应该利用它。 它可以这样实现:

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

源于Java实践中的并发性的源代码。 由于cancel()方法是公共的,你可以让另一个线程调用这个方法。

还有一个命名不清的静态方法interrupted ,清除当前线程的中断状态。

可以用来停止线程的Thread.stop()方法已被废弃; 更多信息见; 为什么Thread.stop,Thread.suspend和Thread.resume已过时? 。

你最好的办法是有一个线程本身所参考的variables,如果variables等于某个值,则自动退出。 然后,当您希望线程退出时,您可以在代码中操作variables。 或者,当然,您也可以使用AsyncTask

目前,不幸的是,我们不能做任何事情来阻止线程….

添加一些东西给马特的答案,我们可以调用interrupt()但不会停止线程…只是告诉系统停止线程,当系统要杀死一些线程。 rest是由系统完成的,我们可以通过调用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类的内部,您都可以创build一个方法,将NULL分配给线程实例,该线程实例可以用作停止线程执行的depreciated 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; } } } 

这对我来说没有问题。