线程的六种状态
无限等待的理解:
一个线程的锁对象在调用wait方法(这个wait方法不带参数)的时候,就进入waiting状态,需要其他的线程的相同锁对象去调用Object.notify()方法 或 Object.notifyAll()方法去唤醒线程。(Object类提供了线程间通信的方法:wait()、notify()、notifyaAl())
它体现的是多个线程间的通信(又叫线程的等待与唤醒),可以理解为多个线程之间的协作关系,共同完成某项任务, 多个线程会争取锁,同时相互之间又存在协作关系。就好比在公司里你和你的同事们,你们可能存在晋升时的竞 争,但更多时候你们更多是一起合作以完成某些任务。
当多个线程协作时,比如A,B线程,如果A线程在Runnable(可运行)状态中调用了wait()方法那么A线程就进入 了Waiting(无限等待)状态,同时失去了同步锁。假如这个时候B线程获取到了同步锁,在运行状态中调用了 notify()方法,那么就会将无限等待的A线程唤醒。注意是唤醒,如果获取到锁对象,那么A线程唤醒后就进入 Runnable(可运行)状态;如果没有获取锁对象,那么就进入到Blocked(锁阻塞状态)。
注意:wait和 notify必须配合synchronized使用,wait方法释放锁,notify方法不释放锁