调用wait()方法到底会让线程处于等待状态还是阻塞状态

如题。

有的博客说会处于阻塞状态(sleep()、wait()、join()都会使线程处于阻塞状态)

有的书上说会处于等待状态(调用wait(),线程处于等待状态)

所以到底是什么状态呢?

为什么呢?

举个例子:

你去奶茶店买奶茶。有两个小姐姐点单,但都有人排队,这里称为A队和B队。你选择A队,排队过程中,你处于等待状态,你看了看人数,估算了一下,大概等待5分钟,就可以排到你点单,很开心。这时,A队小姐姐的点单机爆炸了!!!A队无法点单了,如果你继续在A队,不论等多长时间,都不会有结果,除非有人告诉你,点单机修好了!!!大家可以来继续点单了!

等待是有时间的,时间到了自然而然;阻塞是无休止的,没有人叫醒就永远不醒。

wait是使当前线程进入等待状态的同时失去monitor锁,虽然当前线程失去monitor锁,但是是等待状态。notify将他唤醒,从等待状态直接到阻塞状态,因为当前线程没有monitor锁。根据别人文章,只有在获取monitor锁没有获取到才会进入阻塞状态,所以wait不会将当前线程的状态变成阻塞状态。也有的文章说先notify方法将当前线程从等待状态转变到runnable状态,然后当前线程竞争不到monitor锁,线程再进入阻塞状态。