android中的线程中断小结

来源:互联网 发布:jc js jk 编辑:程序博客网 时间:2024/06/04 18:26

       学Android也有些时候了,期间也是一路学习大咖们的技术blog,想着有时间就应该自己整理才能成为自己的知识,ok,第一次写,文笔也并不如何,有不同意见请指正,请轻pen。

       Android开发中实现多线程机制主要有继承自java的Thread类和实现Runnable接口两种方法,而在共享数据访问以及单继承限制方面还是实现Runnable较为便利,具体实现细节,略。言归正传,说到线程中断。

       线程中断分为两种:控制任务流程走向结束和异常中止。

       而线程异常中止也分为两种:强制调用线程对象的stop方法(结果不可预料)以及捕获异常并中断。

       所以,详细的方式其实是三种,下面详细讲解:

       第一种方式:(暴力中断)

               直接调用thread实例的stop()方法,线程直接中止,但会引起不可预料的结果,如:

       thread = new Thread(new Runnable() {            @Override            public void run() {                try {                    while(true){                        Thread.sleep(1000);                        Log.d("debug", System.currentTimeMillis()+"");                    }                } catch (Exception e) {                    // TODO: handle exception                }            }        });        thread.start();
       接下来,thread.stop()被调用,app的进程中止。因此,除非特殊的用途,一般不建议调用此方法来中断线程。

第二种方式:(流程控制中断)

        我们知道,在线程运行时调用线程实例的interrupt()方法,当线程处于非阻塞状态时,得到线程状态的isInterrupted()返回true,若以此为循环条件,则线程可正常退出循环,结束线程。

        thread = new Thread(new Runnable() {@Overridepublic void run() {while (!Thread.currentThread().isInterrupted())try {                                      //线程非阻塞                                     <span style="color:#FF6666;">//Thread.sleep(5000);</span>Log.d("debug", System.currentTimeMillis() + "");} catch (Exception e) {// TODO: handle exception }}});thread.start();
        thread.interrupt()方法被调用,Thread.currentThread().isInterrupted()置true,退出循环,结束线程。

第三种方式:(捕获异常中断)

        同理,当线程处于阻塞状态时,调用thread.interrupt()方法,程序抛出异常,此时在捕获异常时做处理,中断循环,结束线程。

thread = new Thread(new Runnable() {@Overridepublic void run() {while (!Thread.currentThread().isInterrupted())try {<span style="color:#FF6666;">Thread.sleep(5000);</span>Log.d("debug", System.currentTimeMillis() + "");} catch (InterruptedException e) {<span style="color:#FF6666;">break;</span>}}});thread.start();

最后,说下Future.cancel(mayInterruptIfRunning)方法。据官方的说法,该方法比起thread.interrupt()方法更加安全。因为前者是与线程池一起使用的,不好比较。但有一点,这两个function都无法真正中断任务,只是在线程任务执行过程中插入了中断信号,使Thread.currentThread().isInterrupted()返回值改变,且都受到线程阻塞的限制。

最后的最后,java多线程机制下的阻塞方法(sleep()、wait())内通过不断循环检查isInterrupt的值,随时抛出InterruptedException异常而不改变任务执行。因此,任何执行中的线程,除非暴力中断,其他方法对不可中断任务无效。

OVER



0 0
原创粉丝点击