1. 首先Thread.sleep(long millis):方法 这个大家都不陌生;一定是当前的线程调用此方法,当前线程进入TIMED_WAITING 状态!但不 会释放对象锁。时间结束之后自动苏醒进入runnable 状态
2.Thread.yield,一定是当前线程调用此方法,当前线程放弃获取的 CPU时间片,但不释放锁资源,由运行状态变为就绪状态
3:t.join()/t.join(long millis),当前线程里调用其它线程t的join方法,当前线程进入WAITING/TIMED_WAITING状态,当前线程不会释放已经持有的对象锁,因为内部调用了t.wait,所以会释放t这个对象上的同步锁。线程 t执行完毕或者millis时间到,当前线程进入就绪状态。其中,wait 操作对应的notify是由jvm 底层的线程执行结束前触发的。
其实就是当前的线程方法 执行到这个t.join 之后就会把自己先暂停掉,先去执行调用T.JOIN里的代码块run方法 等待执行完成之后 在执行当前后续的代码
4. obj.wait(),当前线程调用对象的 wait()方法,当前线程释放
obj对象锁,进入等待队列。依靠notify()/notifyAll()唤醒或者wait(Iong timeout)timeout时间到自动唤醒。唤醒会,线程恢复到 wait 时的状态。
5. obj.notify()唤醒在此对象监视器上等待的单个线程,选择是任意性的。
思考:wait 方法 跟sleep方法的区别?