学Android也有些时候了,期间也是一路学习大咖们的技术blog,想着有时间就应该自己整理才能成为自己的知识,ok,第一次写,文笔也并不如何,有不同意见请指正,请轻pen。
Android开发中实现多线程机制主要有继承自java的Thread类和实现Runnable接口两种方法,而在共享数据访问以及单继承限制方面还是实现Runnable较为便利,具体实现细节,略。言归正传,说到线程中断。
线程中断分为两种:控制任务流程走向结束和异常中止。
而线程异常中止也分为两种:强制调用线程对象的stop方法(结果不可预料)以及捕获异常并中断。
所以,详细的方式其实是三种,下面详细讲解:
第一种方式:(暴力中断)
直接调用thread实例的stop()方法,线程直接中止,但会引起不可预料的结果,如:
接下来,thread.stop()被调用,app的进程中止。因此,除非特殊的用途,一般不建议调用此方法来中断线程。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();
第二种方式:(流程控制中断)
我们知道,在线程运行时调用线程实例的interrupt()方法,当线程处于非阻塞状态时,得到线程状态的isInterrupted()返回true,若以此为循环条件,则线程可正常退出循环,结束线程。
thread.interrupt()方法被调用,Thread.currentThread().isInterrupted()置true,退出循环,结束线程。thread = new Thread(new Runnable() { @Override public 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 = new Thread(new Runnable() { @Override public 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