线程正在运行,调用这个线程的wait()方法,这个线程就会进入一个集合进行等待(这个集合的线程不会争抢cpu),此时线程的状态就是waiting
当有线程调用notify()方法的时候,就会从集合中挑选一个线程进入到排队队列里面
notifyAll就是将等待集合中的所有线程唤醒,加入到排队队列中去
wait和notify方法都是属于Object类的
public class Test
{public static void main(String[] args) throws InterruptedException{Object object=new Object();new Thread( ()->{synchronized(object){System.out.println(Thread.currentThread().getName()+"开始运行");object.wait();//执行到这行代码的时候,线程卡在这里了,进入了等待集合System.out.println(Thread.currentThread().getName()+"我被唤醒了,我又重新开始运行了");}},"t1").start();new Thread( ()->{Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+"开始运行");synchronized(object){object.notify();}},"t2").start();}
}
所以运行后:
先是线程1运行,然后执行到object.wait()的这一行的时候,线程1卡住了,进入到Object类的对象object的wait等待集合里,同时将object锁也释放掉
然后线程2运行,它先是拿到object锁,然后唤醒了在object对象的wait等待集合中的线程1,然后线程1就进入排队队列中,cpu一空出来就可以运行
这里区分一下:sleep方法和wait方法
两者都会让线程进入休眠状态,区别在于
(1)使用方法不一样:wait属于Object类的方法,sleep属于Thread类的方法
(2)thread.sleep()方法不会释放对象锁,是释放cpu,如果线程持有锁,那即使sleep()会使线程休眠,但是不会释放锁,
而obj.wai()t方法会释放对象锁,也会释放cpu
总之:sleep释放cpu,不释放锁
wait释放cpu,释放锁
两个都释放cpu,但是sleep不释放锁,wait释放锁
(3)thread.sleep()可以不需要搭配synchronized使用,而obj.wait()必须搭配synchronized使用