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
原创粉丝点击