当前位置:网站首页 > 技术博客 > 正文

线程之间如何进行通信



有两个线程,A 线程向一个集合里面依次添加元素“abc”字符串,一共添加十次,当添加到第五次的时候,希望 B 线程能够收到 A 线程的通知,然后 B 线程执行相关的业务操作。线程间通信的模型有两种:,以下方式都是基于这两种模型实现的。

多个线程同时监听一个变量,当该变量发生变化的时候,线程能够感知并执行相应的业务。这是最简单的一种实现方式:

 
  

Object类提供了线程间通信的方法:wait()、notify()、notifyAll(),它们是多线程通信的基础,而这种实现方式的思想自然是线程间通信。

注意:wait()/notify()/notifyAll() 必须配合 synchronized 使用,wait 方法释放锁,notify 方法不释放锁。wait 是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify(),调用 wait() 的一个或多个线程才会解除 wait 状态,重新参与竞争对象锁,程序如果可以再次得到锁,就可以继续向下运行。

 
  

由输出结果,在线程 A 发出 notify() 唤醒通知之后,依然是走完了自己线程的业务之后,线程 B 才开始执行,正好说明 notify() 不释放锁,而 wait() 释放锁。

jdk1.5之后在java.util.concurrent包下提供了很多并发编程相关的工具类,简化了并发编程代码的书写,CountDownLatch 基于AQS框架,相当于也是维护了一个线程间共享变量 state。

 
  
 
  

这种方式使用起来并不是很好,代码编写复杂,而且线程 B 在被 A 唤醒之后由于没有获取锁还是不能立即执行,也就是说,A 在唤醒操作之后,并不释放锁。这种方法跟 Object 的 wait()/notify() 一样。

LockSupport 是一种非常灵活的实现线程间阻塞和唤醒的工具。使用它不用关注是等待线程先进行还是唤醒线程先运行,但是得知道线程的名字。

 
  

                            

  • 上一篇: js中如何给数组添加数据
  • 下一篇: linux chcp
  • 版权声明


    相关文章:

  • js中如何给数组添加数据2025-05-25 17:01:02
  • c语言pthread线程池2025-05-25 17:01:02
  • c语言结构体指针定义2025-05-25 17:01:02
  • 引用类型与指针类型有什么区别2025-05-25 17:01:02
  • jvm查看gc情况2025-05-25 17:01:02
  • linux chcp2025-05-25 17:01:02
  • 数据库事务和锁的关系2025-05-25 17:01:02
  • ddos攻击测试工具2025-05-25 17:01:02
  • 积分运算电路可以实现的两个功能2025-05-25 17:01:02
  • img标签使用2025-05-25 17:01:02