原理:
- Thread在native实现类有一个成员代表中断状态,interruptState, 初始为false
- Thread在native实现中有一个是否可以阻塞的成员,permit,初始为0,只能为0、1
park native伪代码:
park(){
// 如果permit为1,导致park失效。如先调用unpark再调用park
if(permit > 0){
permit = 0;
return;
}
// 中断状态为true,导致park失效。如调用Thread#interrupt
if(interruptState){
return;
}
阻塞线程 // unpark后会从这唤醒
if(permit > 0){
permit = 0;
}
}
unpark native伪代码:
unpark(Thread t){
if(permit < 1){
permit = 0;
if(线程处于阻塞状态){
唤醒thread
}
}
}