一 、等待/通知机制介绍
两线程存在生产和消费者关系,如while,问题:不停轮询机。浪费CPU,间隔太大取不到。(wait/notify)解决
线程A调用对象O的wait()进入等待状态,B调用对象Onotify()/notifyAll(),A收通知后退出等待队列,运行
相关方法
notify() :通知“一个线程”
notifyAll(): “全部线程” 退出等待,优先级、随机执行,取决于JVM
wait():释放共享资源锁,等待,直到被唤醒
wait(long)n毫秒,没有通知就超时返回 wait(long,int)纳秒
二 等待/通知机制的实现
从运行结果:”wait end 1521967322359”最后输出可以看出,notify()执行后并不会立即释放锁。先进入就绪,再尝试获取
2.2 线程基本状态
2. 可运行(runnable):start()进运行线程池,等待被线程调度选中,获取cpu使用权。
4. 阻塞(block):放弃cpu使用权,让出cpu timeslice,分三种:
等待阻塞:执行o.wait(),JVM把该线程放入waitting queue
同步阻塞:该同步锁被占用,放锁池lock pool
其他阻塞: 运行线程执行sleep(long ms)或t.join(),或者发出I/O请求时,JVM把线程置为阻塞。处理完毕转入runnable
5. 死亡(dead):run()、main()结束,异常退出了run()方法,不可再次复生。
2.3 notify()锁不释放
当方法wait()被执行后,锁自动被释放,但执行完notify()方法后,锁不会自动释放。必须执行完notify()方法所在的synchronized代码块后才释放。
https://github.com/Snailclimb/threadDemo/tree/master/src/wait_notifyHoldLock)
三个同对象实例线程a,b,c:a执行带wait方法synchronized代码块、b,c执行带notify方法synchronized代码块
2.4 当interrupt方法遇到wait方法
wait时,调用interrupt出现InterrupedException
Test.java
运行结果: