《Java高并发编程详解》读书笔记(三)——线程通信

1、同步阻塞与异步非阻塞

(1)同步阻塞
客户端提交event至服务器,服务器接收到客户请求后开辟线程处理客户请求,经过复杂的业务计算后将结果返回给客户端。

(2)异步非阻塞
客户端提交Event后会得到一个相应的工单号并且立即返回,Event则会被放置在Event队列中。服务器有若干个工作线程,不断从Event队列中获取任务并且进行异步处理,最后将处理结果保存在另外一个结果集中,如果客户端想要获得结果处理,则可凭借工单号再次获取。
在这里插入图片描述

2、线程间的通信

(1)wait与notify
wait和notify方法并不是Thread特有的方法,而是Object中的方法。
wait方法

  • wait方法的作用是导致当前进程进入阻塞,有三个重载函数。
    public final void wait() throws InterruptedException
    public final void wait(long timeout) throws InterruptedException
    public final void wait(long timeout, int nanos) throws InterruptedException
  • 使用wait方法必须拥有该对象的monitor,也就是wait方法必须在同步方法中使用。当前线程执行了wait方法后,会释放该对象monitor的所有权,其他线程才有机会争抢该monitor的所有权。
  • 当其他线程调用了Object的notify或者notifyAll方法才能唤醒,或者阻塞时间到达了timeout时间自动唤醒。
  • 线程执行了某个对象的wait方法以后,会加入与之对应wait set中,使用notify方法就相当于线程从wait set中弹出。

notify方法

  • notify方法的作用是唤醒单个正在执行该对象wait方法的线程。
    public final native void notify()
    在这里插入图片描述
  • notify方法也必须在同步方法中使用。被唤醒的线程需要重新获取该对象的monitor才能继续执行。

(2)wait与sleep
相同点

  • wait和sleep方法都可以使线程进入阻塞状态。
  • wait和sleep方法都可中断方法,被中断后会收到中断异常

不同点

  • wait是Object方法,而sleep是Thread特有的方法
  • 线程在同步方法中执行wait时会释放monitor,而sleep不会
  • wait方法的执行必须在同步方法中执行,而sleep则不需要

(3)notifyAll
notifyAll的作用于notiy类似,用于唤醒由于调用了wait方法而阻塞的线程,但是notify方法只能唤醒其中的一个线程,而notifyALL方法则可以同时唤醒全部的阻塞线程。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值