面试题10解析—多线程通讯与协作

面试题10解析—多线程通讯与协作

题目:分别说一下notify()/notifyAll()/sleep()/wait()的区别,以及如何实现多线程之间的通讯和协作?

主要考查多线程的等待问题,以及它们之间的通讯和协作。

notify()/notifyAll()/sleep()/wait()

  • notify():随机唤醒一个等待该对象同步锁的线程,进入就绪队列等待CPU的调度;这里的唤醒是由JVM确定唤醒哪个线程,而且不是按优先级决定。

  • notifyAll():唤醒所有的等待该对象同步锁的线程,进入就绪队列等待CPU调度;注意唤醒的是notify之前wait的线程,对于notify之后的wait线程是没有效果的。

  • wait():调用时需要先获得该Object的锁,调用后,会把当前的锁释放掉同时阻塞住;但可以通过调用该Object的notify()或者notifyAll()来重新获得锁。

  • sleep():在指定的时间内让正在执行的线程暂停执行,但不会释放锁。

区别:

  1. 我们通过对这些方法分析,sleep()方法属于Thread类,而wait()/notify()/notifyAll()属于Object基础类,也就是说每个对象都有wait()/notify()/notifyAll()的功能。

  2. sleep()不会释放锁,而wait()会释放锁。

  3. sleep()必须捕获异常,而wait()/notify()/notifyAll()不需要捕获异常。

  4. sleep()可以在任何地方使用,而wait()/notify()/notifyAll()只能在同步控制方法或者同步控制块里面使用。

如何实现多线程之间的通讯和协作

利用同步和互斥来解决多线程之间的通讯和协作;可以说资源互斥、协调竞争是要解决的因,而同步是竞争协调的果。

  1. 通过synchronized/notify/notifyAll来实现线程之间的通信。

  2. 利用了Java5中提供的Lock/Condition来实现线程之间的相互通信。

  3. 使用信号量,如:CyclicBarrier/Semaphore/Countdownbatch。

怎么解决多线程计算的结果统计?

可以用join()以及Future/FutureTask来解决。join()的功能是使异步执行的线程变成同步执行;使用join()后,直到这个线程退出,程序才会往下执行。

记得关注我们哦,这里全部都是干货!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值