您的位置:首页 > 移动开发 > Android开发

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()。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: