java多线程通信细节 看一次就够了

java多线程之间通信的几种方式:

  • Thread提供的suspend()和resume()方法(已弃用-了解一下):

提供挂起线程的功能,但是由于挂起不释放锁。在对象锁的执行代码块内容易造成死锁。

suspend必须先于resume执行,否则也会造成死锁。

  • Object类提供的wait()/notify()/notifyAll()方法:

只能在对象锁持有者线程内调用(同步控制方法内调用),否则会抛出IllegalMonitorStateException异常。

wait方法使当前线程等待,加入对象的等待集合中去,自动释放对象锁。

notify/notifyAll:唤醒一个或所有等待线程。

顺序调用要求:wait必须先于notify调用,否则会使线程一直出去waiting状态。

  • juc包下的park()/unpark()机制:

part相当与等待许可,unpark为提供许可。因此没有调用顺序的要求。

多次调用unpark后在调用park,线程执行。多次unpart无法叠加。第一个park线程执行。后面的park线程等待,

需要在调用unpark唤醒线程。

  • 线程中断:stop、共享变量、Thread的interrupt方法

  1. stop:已弃用,强制停止线程,抛弃所有锁,可能会导致代码逻辑问题。
  2. 共享变量:通过控制共享变量控制线程。
  3. interrupt:将线程的中断状态设置为true。
  • 线程之间等待:

线程A调用线程B的join方法,那么线程A就要等到线程B执行完成后在继续执行。

  • 注:伪唤醒问题:线程由于其他原因唤醒执行if语句之后的代码块。造成代码错误。

可以通过while代替if解决伪唤醒问题。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值