Java——》线程间是如何通信的

推荐链接:

总结------》【Java】

总结------》【Mysql】

总结------》【Redis】

总结------》【Kafka】

总结------》【Spring】

总结------》【SpringBoot】

总结------》【MyBatis、MyBatis-Plus】

总结------》【Linux】

总结------》【MongoDB】

总结------》【Elasticsearch】

Java------》线程间是如何通信的

线程之间的通信有两种方式:共享内存消息传递

一、共享内存

在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。

典型的共享内存通信方式,就是通过共享对象进行通信。

例如线程A与线程B之间如果要通信的话,那么就必须经历下面两个步骤:

  1. 线程A:把本地内存A更新过的共享变量刷新到主内存中去。
  2. 线程B:到主内存中去读取线程A之前更新过的共享变量

二、消息传递

在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。

在Java中典型的消息传递方式:

  • wait()和notify()方法
  • wait(long timeout)和notify()方法
  • join()方法
  • Lock和Condition接口
  • BlockingQueue阻塞队列

1、wait()和notify()方法

wait()方法使线程进入等待状态,直到其他线程调用notify()或notifyAll()方法将其唤醒。notify()方法唤醒一个等待中的线程,notifyAll()方法唤醒所有等待中的线程。

2、wait(long timeout)和notify()方法

wait(long timeout)方法使线程进入等待状态,直到其他线程调用notify()方法将其唤醒,或者等待时间超过指定的timeout时间。notify()方法唤醒一个等待中的线程。

3、join()方法

join()方法使一个线程等待另一个线程执行完毕。当一个线程调用另一个线程的join()方法时,当前线程将被阻塞,直到另一个线程执行完毕。

4、Lock和Condition接口

Lock接口提供了比synchronized关键字更灵活的锁机制,Condition接口提供了更灵活的等待/通知机制。

通过Lock接口的lock()方法获取锁,unlock()方法释放锁。

通过Condition接口的await()方法使线程等待,signal()方法唤醒一个等待中的线程,signalAll()方法唤醒所有等待中的线程。

5、BlockingQueue阻塞队列

BlockingQueue是一个支持阻塞操作的队列。

当队列为空时,获取元素的线程将被阻塞,直到队列中有可用元素;

当队列满时,插入元素的线程将被阻塞,直到队列有空闲位置。

相关推荐
蘑菇丁18 分钟前
ansible批量生产kerberos票据,并批量分发到所有其他主机脚本
java·ide·eclipse
呼啦啦啦啦啦啦啦啦1 小时前
【Redis】持久化机制
java·redis·mybatis
我想学LINUX2 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
空の鱼7 小时前
java开发,IDEA转战VSCODE配置(mac)
java·vscode
P7进阶路8 小时前
Tomcat异常日志中文乱码怎么解决
java·tomcat·firefox
小丁爱养花8 小时前
Spring MVC:HTTP 请求的参数传递2.0
java·后端·spring
CodeClimb8 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
等一场春雨8 小时前
Java设计模式 九 桥接模式 (Bridge Pattern)
java·设计模式·桥接模式
带刺的坐椅9 小时前
[Java] Solon 框架的三大核心组件之一插件扩展体系
java·ioc·solon·plugin·aop·handler