【Java学习笔记】16:线程的协调
来源:互联网 发布:国动通信网络招聘 编辑:程序博客网 时间:2024/06/05 08:32
一个进一步的线程问题:
①空间有空闲则写入数据,否则等候空出
②若空出,通知正在等候的线程
三个相关方法:wait()让线程等候,notify()和notifyAll()启动等候中的线程。
wait()
所有实例都有一个wait set,它是一个在执行实例的wait()方法时、操作停止的线程的结核,可以看成线程的休息室。
发生以下情况之一时线程退出wait set:
①其它线程以notify或者notifyAll方法唤醒该线程
②其它线程以interrupt方法唤醒该线程
③wait方法到期
如在某线程中执行了obj.wait()则该线程进入obj的wait set,称为线程在obj上wait。
如在昨天学习的synchronized方法里,若调用了wait()即this.wait(),线程将进入this的wait set,这样就释放了锁定,其它线程就可以用synchronized方法了。
notify()
使用notify()方法时,可以从对应实例里抓出一个线程唤醒,如刚刚的两个synchronized方法和两个线程,线程A先调用了第一个同步方法,然后里面有wait()语句使线程A进入了this的wait set,然后线程A释放了锁定这样线程B又开始执行,它执行了第二个同步方法,方法里有notify()也就是this.notify(),这样就去this的wait set里找到了线程A并唤醒了。
注意,虽然线程A被唤醒了,但是线程B还握着锁定不放,因为A的作用也是去执行synchronized方法,所以这时候还是不能执行的,还是要等待线程B释放锁定。
补充:如果执行notify方法时,wait set里正在等候的线程不止一个,到底选择哪个线程要按照Java处理系统而异。
notifyAll()
obj.notifyAll()会唤醒留在实例obj的wait set里的所有线程。
一般在notify()和notifyAll()中选择notifyAll()。
以上三个方法的调用,线程必须获取调用实例的锁定,否则会抛出异常IllegalMonitorStateException。
由于所有实例都会有wait set,所以这三个方法都是Object类的方法。
与线程相关的其它处理(后面学):
①取消线程处理的中断
Interrupt,isInterrupted,interrupted,InterruptedException
②线程的优先级
setPriority,getPriority
③等候线程结束
Join
有时候线程因为某些因素无法继续进行下去,如线程A想执行synchronized方法时其他方法已经获取相同实例的锁定,线程A就无法向前推进,称为线程A有阻挡或者线程A被阻挡。
近期笔记参考自:中国铁道出版社《Java多线程设计模式》。
- 【Java学习笔记】16:线程的协调
- java笔记六:线程间的协调
- java线程间的协调
- java:线程间的协调(二)
- Java之线程协调
- 线程的协调工作
- 线程间的协调
- 线程的协调
- 线程间的协调
- java中的线程协调与线程间的数据交换
- Java线程的学习笔记
- 线程的同步和协调
- 操作系统学习笔记:分布式协调
- 程序员学习笔记---java线程的学习
- Java多线程设计(二)线程的基本知识(3)线程的协调
- Java多线程(四)- 协调同步线程
- java#5 线程通信:线程的协调运行,条件变量,管道
- java线程学习笔记
- angular-validation 使用方法
- redis的持久化、备份、容灾
- 事件流
- 如何直观的解释back propagation算法(三)
- Linux的slab分配器
- 【Java学习笔记】16:线程的协调
- C# WinForm开发系列之自定义无边框窗体(最大化,最小化,关闭,拉伸和移动的相关知识)
- JPEG压缩原理
- mysql中string和number的转换问题
- CentOS 7 安装、配置、使用 PostgreSQL 9.5(一)安装及基础配置
- 内存一致性模型(Memory Consistency Models)
- github 将本地项目提交到仓库中(二)
- CDH 基本环境安装脚本
- 小姑娘的一句话,让90%的销售都惭愧了