(四)wait/notify

一 、等待/通知机制介绍 

两线程存在生产和消费者关系,如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

运行结果: 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容