一:模版
- 某个问题描述
- 测试代码---方案----官方api的中文描述(这部分也是个难点,因为很多时候就是看不懂api的英文注释才懵逼的,比如 Thread#interrupt()接口一大坨 "如果那么"这种case,这就是别人博客分享的价值之一)
- 测试结果
- 测试结果分析
二:具体精华实例: blog.csdn.net/qq_20952591… # 线程篇——线程的停止与中断
三:其他资料 1,项目中实际案例: 自定义的SurfaceView线程中 getHolder().lockCanvas() 来源: www.cnblogs.com/jiaozebo/ar…
当界面无效(比如尚未创建成功或者已经被销毁了)时,getHolder().lockCanvas() 方法会sleep 100毫秒,用以释放出CPU资源(your calls will be throttled to a slow rate in order to avoid consuming CPU)。然而,当sleep方法抛出InterruptedException后,会取消线程的中断状态,但是在这个函数里,设计者却把sleep的异常给swallow了。因此,在调用了mTheThread.interrupt()之后,线程的中断状态被sleep给取消了,导致在while里,条件永远是成立的。而线程不退出,stop函数里的join函数也会一直阻塞,因而出现无法退出线程的问题。
三:总结
| 是否中断判断方法 | 获取状态的目标线程对象 | flag clear | static | 多次调用行为一致 |
|---|---|---|---|---|
| isInterrupted() | 当前运行的子线程 | false | false | true |
| interrupted() | 当前运行的子线程 | true | true | false(连续调用的第二次行为不一样) |
java jdk包 Thread.java 更清晰,android sdk包里 Thread.java 实现改了看不出来。
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
public boolean isInterrupted() {
return isInterrupted(false);
}
/**
* Tests if some Thread has been interrupted. The interrupted state
* is reset or not based on the value of ClearInterrupted that is
* passed.
*/
private native boolean isInterrupted(boolean ClearInterrupted);
public static native Thread currentThread();