美文网首页
优雅的中断线程

优雅的中断线程

作者: 特大碗牛肉面 | 来源:发表于2018-09-29 09:39 被阅读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();
    }
    

    相关文章

      网友评论

          本文标题:优雅的中断线程

          本文链接:https://www.haomeiwen.com/subject/dbfeoftx.html