面试复习-线程篇-线程的停止与中断

108 阅读1分钟

一:模版

  1. 某个问题描述
  2. 测试代码---方案----官方api的中文描述(这部分也是个难点,因为很多时候就是看不懂api的英文注释才懵逼的,比如 Thread#interrupt()接口一大坨 "如果那么"这种case,这就是别人博客分享的价值之一)
  3. 测试结果
  4. 测试结果分析

二:具体精华实例: 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 clearstatic多次调用行为一致
isInterrupted()当前运行的子线程falsefalsetrue
interrupted()当前运行的子线程truetruefalse(连续调用的第二次行为不一样)
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();