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; } } }
这对我来说没有问题。