Android 线程(Thread)主要用来处理耗时动作。比如长时间接收数据,刷新UI,等等。
写法1:
new Thread(new Runnable() { @Override public void run() { while(flag){ Log.d(tag,"Thread run"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start();
写法2:
class MyThread extends Thread { public MyThread() { super(); } public void run() { super.run(); while(flag){ Log.d(tag,"MyThread run"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
Thread thread = new MyThread(); thread.start();
这也可以这样使用,是一样的:
MyThread thread = new MyThread(); new Thread(thread).start();
线程对象属于一次性消耗品,一般线程执行完run方法之后,线程就正常结束了,线程结束之后就报废了,不能再次start,只能新建一个线程对象。但有时run方法是永远不会结束的。例如在程序中使用线程进行Socket监听请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。当需要结束线程时,如何退出线程呢?
有三种方法可以结束线程:
1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止
2. 使用interrupt()方法中断线程
3. 使用stop方法强行终止线程(不推荐使用,可能发生不可预料的结果)
前两种方法都可以实现线程的正常退出,也就是要谈的优雅结束线程;第3种方法相当于电脑断电关机一样,是不安全的方法。
第一种方法,控制标志:
public void run() {
while(flag){
}
}
2、使用interrupt()方法终止线程
使用interrupt()方法来终端线程可分为两种情况:
线程处于阻塞状态,如使用了sleep,同步锁的wait,socket的receiver,accept等方法时,会使线程处于阻塞状态。当调用线程的interrupt()方法时,系统会抛出一个InterruptedException异常,代码中通过捕获异常,然后break跳出循环状态,使线程正常结束。通常很多人认为只要调用interrupt方法线程就会结束,实际上是错的,一定要先捕获InterruptedException异常之后通过break来跳出循环,才能正常结束run方法。
while(flag){ Log.d(tag,"MyThread run"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); break;//当捕捉到InterruptedException时,退出线程。 } }
这里记住,interrupt()并不能终止run方法,只能抛出异常。捕获InterruptedException异常之后通过break来跳出循环,才能正常结束run方法