Java多线程与并发03: Wait & Notification
多线程的协同
多个线程之间协同使用共享资源的问题,对资源的读写进行条件控制,使用wait和notify方式控制线程之间的等待和唤醒操作。
object类提供的api
wait方法:当前线程等待某个条件的成立,其他线程可以使用notify或notifyall方法唤醒当前线程。
wait(long timeout)方法:与上面类似,但是有个超时时间,不会一直wait
notify()随机唤醒一个等待中的线程。
notifyAll()唤醒所有,谁抢到锁是谁的。
基本使用格式:
共享资源的实例
共享资源类:
资源生产者:
资源消费者:
可能会出现以下问题:
这是因为共享资源没有同步。
可以做以下改进:
这里的writable就是线程的唤醒条件,当条件不成立时,在while循环中wait,直到被notify唤醒。被notify唤醒后可能会条件成立也可能不成立,需要再次判断,若条件成立,将执行while循环后的代码,唤醒对方的线程。