Android 如何结束线程
2015-05-14 16:44
183 查看
零.导言
对于java.lang.Thread这个类中的stop(),suspend(),destroy(),resume()都已经被废除掉了(原因见这:点我),不过start()还可以使用。所以结束线程现在本质上有1种方法:执行完run()方法,结束。所以以这个本质方法为基础点,衍生出下面的方法:
一.方法一(线程普通操作,无阻塞操作)
1.代码如下
private MyRunnable mRunnable = new MyRunnable(); private Thread mThread = null; class MyRunnable implements Runnable{ private voilatile boolean isRun = true; public void SetStop(){ isRun = false; } public void run(){ try{ while(isRun){ Thread.sleep(5000); Log.d("test","hehehe"); for(int i = 0;i < 1000000;i++) { log.d("test","i"); } } } } } protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); RelativeLayout relatevieLayout = new RelativeLayout(this); Button button = new Button(this); button.setText("click me"); button,setOnClickListener(new OnClickListener(){ public void onClick(View v){ mThread.SetStop(); } ); relativeLayout.addView(button); setContentView(relativeLayout); mThread = new Thread(mRunnable); mThread.start(); }
2.代码解释
在run()函数中,用一个变量来控制while循环. 当我们需要结束该线程的时候,改变这个变量的值,来结束while循环。就可以安全的退出run()。3.方法的不足
这种方法结束线程的前提是:线程处于运行态,如果我们run()函数中调用了sleep(),wait(),或者是在I/O操作中阻塞了当前的线程(线程处于非运行态),那么我们while循环的条件,迟迟得不到检测,线程也不能立马结束掉。所以请看增强版:方法二。
二.方法二(可适用线程普通操作,阻塞操作)
1.代码如下
private MyRunnable mRunnable = new MyRunnable(); private Thread mThread = null; class MyRunnable implements Runnable{ public void run(){ try{ while(!mThread.isInterrupted()){ Thread.sleep(5000); Log.d("test","hehehe"); for(int i = 0;i < 1000000;i++) { log.d("test","i"); } } }catch (InterruptedException e){ Log.d("test","interrupt thread"); } } } protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); RelativeLayout relatevieLayout = new RelativeLayout(this); Button button = new Button(this); button.setText("click me"); button,setOnClickListener(new OnClickListener(){ public void onClick(View v){ mThread.interrupt(); } ); relativeLayout.addView(button); setContentView(relativeLayout); mThread = new Thread(mRunnable); mThread.start(); }
2.代码解释
(a) 当我们正在执行Thread.sleep(5000)的时候,我们点击了button,调用了mThread.interrupt(),此时就会立即中断sleep(不会等待sleep的执行完执行时间),抛出一个InterruptedException 的异常,我们处理我们需要保存的线程状态,然后就退出了线程。(b) 如果我们正在执行run()中的for循环,此时我们点击了button,调用了mThread.interrupt(),它不会抛出任何异常,只是简单的设置了interrupted flag ,然后我们在
while条件中调用mThread.isInterrupted()来检测这个flag,以便正常退出run()。
相关文章推荐
- Android java 中如何优雅的结束线程
- Android java 中如何优雅的结束线程
- Android 如何监听一个线程的开始和结束
- android 如何结束一个线程?
- Android java 中如何优雅的结束线程
- Android java 中如何优雅的结束线程
- android 如何结束一个线程
- Android如何结束并重启线程?
- Android java 中如何优雅的结束线程
- Android java 中如何优雅的结束线程
- Android java 中如何优雅的结束线程
- android 如何结束一个线程?
- android源码解析(4)--如何结束运行中的分线程
- Android 如何判断当前线程是否是主线程
- Android开发中如何结束所有的activity
- 关于Android如何给传递线程初始化数据
- C# 中如何判断线程是否结束
- 黑马程序员:如何结束线程及线程中的其他方法介绍:interrupt()、join()、yield()等方法
- android开发中如何结束所有的activity
- Android 中不用线程如何实现倒计时