java多线程核心技术 第三章线程间通信
来源:互联网 发布:恢复存储卡数据 编辑:程序博客网 时间:2024/05/13 12:34
1.等待通知机制
wait/notify
如果有多个线程等待的时候 notify会随机挑出一个wait状态的线程发出notify通知,并使它等待获取该对象的对象锁。 注意:在执行notify方法后,当前线程不会马上释放该对象锁,呈wait状态的线程并不能马上获取该对象锁,要等到执行notify方法的线程将程序执行完,也就是退出synchronized代码块后,当前线程才会释放锁,而呈wait状态所在的线程才可以获取该对象锁。当第一个获得了该对象锁的wait线程运行完毕以后,它会释放掉该对象锁,此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态的线程由于没有得到改对象的通知,还会继续阻塞在wait状态,直到这个对象发出一个notify 或者notifyAll
总结:wait使线程停止运行,而notify使停止的线程继续运行。
notify是随机唤醒队列中等待同一资源的一个线程,使其进入可运行状态,但不一定立即运行
notifyAll使等待队列中的所有线程全部进入可运行状态,不一定哪个线程先执行,可能是优先级高的,也有可能是随机执行。
线程进入Runnable状态大体分为5中情况:
1.调用sleep方法后经过的时间超过了指定的休眠时间
2.线程调用的阻塞io已经返回,阻塞方法执行完毕
3.线程成功地获得了试图同步的监视器
4.线程正在等待某个通知,其他线程发出了通知。
5处于挂起状态的线程调用了resume方法。
出现阻塞的情况大体分为5种:
1.线程调用sleep方法,主动放弃占用的处理器资源。
2.线程调用了阻塞式IO方法,该方法返回前,该线程被阻塞。
3.线程试图获得一个同步监视器,但该同步监视器正在被其他线程所持有
4.线程等待某个通知
5.程序调用了suspend方法将该线程挂起。此方法容易造成死锁,尽量避免使用该方法。
java 中wait方法 会释放锁
notify方法不释放锁
sleep 方法也不会释放锁
注意:当线程处于wait状态这时候调用 interrupt()方法就回造成interruptedException异常
wait(long)支持传递一个毫秒数 在这个时间后会自动唤醒,但是这个时间内也可以被其他线程唤醒
练习生产者消费者
2.join方法 作用:等待对象线程销毁
join 在遇到interrupt()方法 也会出现中断异常
join 和sleep的区别
join会释放锁 内部是wait实现的
sleep不会释放锁
3.ThreadLocal 主要是解决变量在不同线程中的隔离性(子线程和父线程中取得的值也是不同),也就是不同线程拥有自己的值,不同线程中的值可以放入ThreadLocal进行保存
解决get值为null 继承ThreadLocal 重写initialValue()方法初始化返回一个值
4.InheritableThreadLocal 可以在子线程中取得父线程中的值
注意一点,在子线程取得值得同时,主线程将InheritableThreadLocal 中的值进行修改 那么子线程取到的值是旧值 取得的值应该是 childValue方法返回的值
阅读全文
0 0
- java多线程核心技术 第三章线程间通信
- Java多线程核心技术(三):线程间通信
- 《java多线程编程核心技术》之线程间通信
- 《java多线程编程核心技术》读书笔记3:线程间的通信
- Java多线程编程核心技术---线程间通信(一)
- Java多线程编程核心技术---线程间通信(二)
- java多线程编程核心技术3-线程间通信
- 【java多线程编程核心技术】3.线程间通信 -笔记总结
- Java多线程编程核心技术第三章笔记
- 《Java多线程编程核心技术》(三)线程通信
- Java多线程--线程间通信
- java多线程线程通信
- Java 多线程:线程通信
- 【Java 多线程】Java 线程间通信
- Java多线程编程核心技术之---停止线程
- Java的多线程-线程间的通信
- java多线程与线程间通信
- java多线程与线程间通信
- 双十一大战提前开场,微鲸成天猫家电第一爆款
- 逗逼《蚁人》的背后,纺服业B2B“巨人”崛起—链尚网
- nginx: unrecognized service 问题解决
- 这个叫做刀客的品牌,用梦想吸引了6万人支持
- 互联网安全领袖峰会将召开 政企领袖共谋安全新生态圈
- java多线程核心技术 第三章线程间通信
- 「云栖大会现场」马云:十五年前,我去硅谷融资被拒绝了30几次
- Maven详解
- VmWare安装ArchLinux
- 关于thinkphp3.2.3类库的加载使用
- qt画图控件QCustomPlot
- TCP/IP、Http、Socket的区别
- 微软的安全探索之路 智能时代如何守护用户安全
- 专访叮咚回家甄军涛:世界再大,也要回家