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方法