Android线程的中断方式

最近的项目开发中恰好有一个功能 是 生产者、消费者模式的 最佳实践用例, 通过不断深挖,发现这里有非常多的细节问题需要考量。 借此文章来加深认识和记忆。


1、线程对象属于一次性消耗品,一般线程执行完run方法之后,线程就正常结束了。

2、线程结束之后就报废了,不能再次start,只能新建一个线程对象。


中断线程的几种方式:

1、自然中断:Thread的Runnable 方法执行完毕后,thread会自动进入 中断状态,被系统回收

2、在Runnable里的 while等循环中,通过 自己 退出标记 来 退出, 识别到退出标记=true时,直接 return;

3、在要被终止的线程内 或者 创建此线程的父线程 中调用  thread.interrupt()  来中断子线程。  这里有两种情况:

   3.1、父线程调用  子线程.interrupt() 时,子线程正处于 阻塞状态,这时 子线程会在 阻塞的方法里抛出 InterruptedException,子线程只能 在 阻塞的方法处 try catch 捕获这个异常,在 catch 里 return 来退出线程。  注意:不能使用 thread.isInterrupt() 判断, 因为这个标记在抛出InterruptedException异常后,被 jvm 置为  false 了。

   3.2、父线程调用  子线程.interrupt() 时,子线程正处于 isAlive()=true 状态,  这种情况下 jvm 并不会因为 父线程调用了  子线程.interrupt(),而中断子线程,  jvm只会修改子线程的 中断位标记  为 true,子线程需要 在 自己的合适时机,通过判断  thread.isInterrupted() 若为true,则直接 return run方法来退出线程。

4、thread.stop() 强制停止线程, 不推荐使用,可能发生不可预料的结果。 

    但是stop方法是很危险的,就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,不安全主要是:thread.stop()调用之后,创建子线程的线程就会抛出ThreadDeatherror的错误,并且会释放子线程所持有的所有锁。一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用thread.stop()后导致了该线程所持有的所有锁的突然释放(不可控制),那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。因此,并不推荐使用stop方法来终止线程。


与业务功能的联系:

      在一些复杂的业务场景下,例如生产者消费者线程,  如何安全、优雅的退出 这两个线程, 需要有更多的考量, 安全指的是不存在任何小概率的线程数据同步问题、优雅指的是代码的可读性、可维护性高



猜你喜欢

转载自blog.csdn.net/u013394527/article/details/80584295
今日推荐