判断线程是否需要挂起,首先需要注意的是这个方法的参数是当前节点的前置节点。当线程需要挂起的时候,它需要把身后事安排明白,挂起后让谁来把我唤醒。这个方法就主要做这个操作。我们再来看Node节点中的waitStatus状态,这个状态有一个Node.SIGNAL=-1,代表了当前节点需要将后置节点唤醒。这个理解可能有点绕。首先我们要理解一点,如果我需要被唤醒,那么我就要设置我们的前置节点的状态为Node.SIGNAL,这样当我的前置节点发现waitStatus=Node.SIGNAL时,它才知道,我执行完后需要去唤醒后置节点让后置节点去执行。所以这个方法是当前节点去设置自己的前置节点的状态为Node.SIGNAL。
waitStatus初始化后是0,
第一次进入该方法,发现自己的前置节点不是Node.SIGNAL,需要先设置为Node.SIGNAL状态
第二次进入时发现前置节点已经是Node.SIGNAL状态,那么我就可以安心的挂起了,有人会唤醒我的。
所以这个方法其实是两个逻辑,先设置前置节点状态,再判断是否可以挂起。因为前面acquireQueued方法中for (;