优雅的中断线程

2018-09-29  本文已影响0人  特大碗牛肉面

创建线程的两种方法:

  • 继承Thread, 并实现run方法;
  • 实现Runnable;

不管是使用哪一种方法创建线程,run方法的任务执行完了,线程就自动停止.
stop():不建议使用

public class ThreadStop extends Thread {
    @Override
    public void run() {
        super.run();
        for (int i=0;i<100000;i++){
            Log.e("ThreadStop","run: "+i);
        }
    }
}

thread = new ThreadStop();
        thread.start();
        thread.stop();
运行的日志

虽然stop()可以停止一个线程,但是这个方法是不安全的,因为如果线程中操作的是一些复杂一点的对象,例如bitmap, 线程突然停止的话就会发生一些意想不到的bug, 而且这个api已经被JAVA弃用作废了,最好不要使用它。

isInterrupted():

测试线程Thread对象是否已经是中断状态,但是不清除状态标志。

interrupted():

内部实现是调用的当前线程的isInterrupted(),并且会重置当前线程的中断状态,(取反,如果连续调用两次该方法,则第二次调用将返回 false (在第一次调用线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来))

interrupt():建议使用

interrupt是中断的意思,调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真正停止线程;

 Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i ++){
                    try {
                        Thread.sleep(100);
                        Log.e("interrupt","thread run" + i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        break;
                    }
                }
            }
        });
        thread.start();
        Log.e("interrupt","thread sleep" + "");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e){
            e.printStackTrace();
        }
        thread.interrupt();
        Log.e("interrupt","thread end");

09-28 17:14:54.234 2210-2210/com.example.administrator.javademo E/interrupt: thread sleep
09-28 17:14:54.334 2210-2323/com.example.administrator.javademo E/interrupt: thread run0
09-28 17:14:54.434 2210-2323/com.example.administrator.javademo E/interrupt: thread run1
09-28 17:14:54.534 2210-2323/com.example.administrator.javademo E/interrupt: thread run2
09-28 17:14:54.644 2210-2323/com.example.administrator.javademo E/interrupt: thread run3
09-28 17:14:54.734 2210-2210/com.example.administrator.javademo E/interrupt: thread end
09-28 17:14:54.734 2210-2323/com.example.administrator.javademo W/System.err: java.lang.InterruptedException

安全终止线程, 可以再加多一个判断, 使用 this.interrupted() 来判断当前线程是否停止了 ,如果停止就不往下执行 ,直接跳出循环体;

if (this.interrupted()){
     break;
}

或者:

if (this.interrupted()) {
    throw new InterruptedException();
}
上一篇下一篇

猜你喜欢

热点阅读