问题是最好的老师!
一、思考
- 问题一:什么情况下线程会中断?
线程自己会中断吗,为什么要去中断一个线程,在什么情况下才能中断一个线程。
- 问题二:如何中断一个线程?
- 问题三:线程被中断意味着什么?
线程被中断了,其状态是什么,被中断的线程还能继续执行吗。
二、带着疑问看源码
与Thred中断相关的方法(除去private native之外可被调用)有Thread.interrupt(),Thread.interrupted(),Thread.isInterrupted(),从字面意思可以看出interrupt方法为中断线程的方法,其余两个为判断线程是否中断。接下来一个一个分析。
- 方法一:interrupt方法
看这个方法之前先知道如下有两个对象(属于Thread),先不管什么意思,interrupt方法会用到:
private volatile Interruptible blocker;
private final Object blockerLock = new Object();
//属于Thread的实例方法,当被调用时,中断当前线程。
public void interrupt() {
//如果当前线程实例不是正在执行的线程,例如在A(Thread.currentThread)线程执行过程中中断B(this)线程(先不讨论为什么这么做,等分析完再讨论),检查访问权限。
if (this != Thread.currentThread())
//看下面checkAccess方法分析(实际没有做权限校验)。
checkAccess();
synchronized (blockerLock) {
Interruptible b = blocker;
//查看Thread内所有方法,唯有Thread.blockedOn方法会设置blo