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();
Android终止线程的方法:
线程对象属于一次性消耗品,一般线程执行完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方法