面试高频知识点:2线程 2.1.6线程之间如何通信

线程之间的通信方式

在Java中,常见的线程之间通信方式包括:

  1. 共享内存:通过共享内存区域进行通信,即多个线程共享同一块内存区域。通常需要使用同步机制来保护共享数据的一致性。

  2. 消息传递:通过消息传递的方式进行通信,即线程之间通过发送和接收消息来进行信息交换。

下面将分别介绍这两种通信方式,并提供示例代码。

共享内存通信方式

共享内存通信方式是通过共享内存区域进行数据交换的方式。在Java中,可以使用共享对象(例如共享变量)来实现线程之间的通信。常见的共享内存通信方式包括:

  • 使用synchronized关键字对共享变量进行同步;
  • 使用volatile关键字保证共享变量的可见性;
  • 使用Lock和Condition等并发工具类进行线程同步。

下面是一个使用synchronized关键字实现的示例:

class SharedObject {private int sharedData;public synchronized void setSharedData(int data) {sharedData = data;notify(); // 通知等待中的线程}public synchronized int getSharedData() throws InterruptedException {while (sharedData == 0) {wait(); // 等待数据被设置}return sharedData;}
}class Producer extends Thread {private SharedObject sharedObject;public Producer(SharedObject sharedObject) {this.sharedObject = sharedObject;}@Overridepublic void run() {sharedObject.setSharedData(1);}
}class Consumer extends Thread {private SharedObject sharedObject;public Consumer(SharedObject sharedObject) {this.sharedObject = sharedObject;}@Overridepublic void run() {try {int data = sharedObject.getSharedData();System.out.println("Consumer received data: " + data);} catch (InterruptedException e) {e.printStackTrace();}}
}public class SharedMemoryCommunicationExample {public static void main(String[] args) {SharedObject sharedObject = new SharedObject();Producer producer = new Producer(sharedObject);Consumer consumer = new Consumer(sharedObject);producer.start();consumer.start();}
}

消息传递通信方式

消息传递通信方式是通过发送和接收消息来进行线程间的通信。在Java中,可以使用wait、notify和notifyAll方法实现线程之间的消息传递。也可以使用阻塞队列(如LinkedBlockingQueue)等并发容器来进行消息传递。

下面是一个使用wait和notify方法实现的示例:

class Message {private String content;public synchronized void setContent(String content) {this.content = content;notify(); // 通知等待中的线程}public synchronized String getContent() throws InterruptedException {while (content == null) {wait(); // 等待消息被设置}return content;}
}class Sender extends Thread {private Message message;public Sender(Message message) {this.message = message;}@Overridepublic void run() {message.setContent("Hello, Receiver!");}
}class Receiver extends Thread {private Message message;public Receiver(Message message) {this.message = message;}@Overridepublic void run() {try {String receivedContent = message.getContent();System.out.println("Receiver received message: " + receivedContent);} catch (InterruptedException e) {e.printStackTrace();}}
}public class MessagePassingCommunicationExample {public static void main(String[] args) {Message message = new Message();Sender sender = new Sender(message);Receiver receiver = new Receiver(message);sender.start();receiver.start();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Intellij Idea的数据库工具 DataGrip

DataGrip DataGrip: IDEA自带,非常好用。智能提示很强大,快捷键跟IDEA自身一致。 如果下载不了 DataGrip,也可以直接用 IDEA 自带的。 常用的快捷键 alt8: 打开数据库Service ctrlshiftF10:打开常用的数…

【C++】类的6个默认成员函数

目录 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 运算符重载 5.1运算符重载 5.2赋值运算符重载 5.3前置和后置重载 5.4日期类的实现 6. const成员函数 7. 取地址及const取地址操作符重载 1. 类的6个默认成员函数 对于一个空类,编…

PriorityQueue主要方法(Java)

PriorityQueue优先队列 PriorityQueue 是 Java 中的一个基于优先级的队列,它可以实现最小堆或最大堆的功能。在 PriorityQueue 中,每个元素都有一个优先级,根据优先级可以决定出队顺序。 PriorityQueue 的实现基于堆,堆是一种完…

JSDoc 真能取代 TypeScript?

这几个月,想必大家都听到过一个新闻: Svelte 弃用 TypeScript,改用 JSDoc 了。 TypeScript 我们知道,是用来给 JS 加上类型的,可以实现类型提示和编译时的类型检查。 那 JSDoc 能够完成一样的功能么?Svel…

图像处理常用算法—6个算子 !!

目录 前言 1、Sobel 算子 2、Isotropic Sobel 算子 3、Roberts 算子 4、Prewitt 算子 5、Laplacian算子 6、Canny算子 前言 同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。 需要说明的是:边缘和物体间的边界并不…

Android应用图标微技巧,8.0系统中应用图标的适配

大家好,2018年的第一篇文章到的稍微有点迟,也是因为在上一个Glide系列结束之后一直还没想到什么好的新题材。 现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了。三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接着小米、华为、OV等国产手机厂…

一句话总结Docker与K8S的关系

一句话总结:Docker只是容器的一种,它面向的是单体,K8S可以管理多种容器,它面向的是集群,Docker可以作为一种容器方案被K8S管理。下文继续具体介绍。 1、容器的核心概念 介绍这几个核心概念:OCI、CR、Runc、…

C语言指针运算

指针运算 指针加法意味着地址向上移动若干个目标指针减法意味着地址向下移动若干个目标示例: int a 100; int *p &a; // 指针 p 指向整型变量 aint *k1 p 2; // 向上移动 2 个目标(2个int型数据) int *k2 p - 3; // 向下移动 3 个…

springboot/ssm出租车管理系统车辆调度管理系统Java系统

springboot(ssm出租车管理系统 车辆调度管理系统Java系统 开发语言:Java 框架:springboot(可改ssm) vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7&…

PWM输入输出

PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域。 PWM参数 PWM 中有三个重要参数&…

寒假作业-day7

1>现有文件test.c\test1.c\main.c , 请编写Makefile. 代码: CCgcc EXEstr OBJS$(patsubst %.c,%.o,$(wildcard *.c)) CFLAGS-c -oall:$(EXE)$(EXE):$(OBJS)$(CC) $^ -o $%.o:%.c$(CC) $(CFLAGS) $ $^head.o:head.hclean:rm $(OBJS) $(EXE) 2>C编程实现&…

封装sku组件

1. 准备模板渲染规格数据 使用Vite快速创建一个Vue项目&#xff0c;在项目中添加请求插件axios&#xff0c;然后新增一个SKU组件&#xff0c;在根组件中把它渲染出来&#xff0c;下面是规格内容的基础模板 <script setup> import { onMounted, ref } from vue import axi…

NOVATEK显示技术系列之CEDSCHPI Training差异简介

CEDS的数据封包格式&#xff1a;首先CEDS数据封包包括三个部分&#xff1a; Training Pattern即Phase1Control Data 即 Phase2RGB Data 即Phase3 Power on Timing&#xff1a; 工作原理&#xff1a; Power ON时&#xff0c;TCON会发Training Pattern&#xff0c;当COF接受Tr…

江科大STM32 终

目录 SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件外设读写W25Q64 BKP备份寄存器、PER电源控制器、RTC实时时钟11.0 Unix时间戳代码示例&#xff1a;读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR电源控制12.1 PWR简介代码示例&#xff1a;修改主频12.3 串…

Linux挂载新的存储设备

1. 尝试mount ls /mnt/sdb mkdir /mnt/sdb mount /dev/sdb /mnt/sdb如果挂载失败, 提示只读之类的, 可能是因为这个磁盘并没有分区, 需要分区. 执行以下语句要注意, 是分区, 如果本身有数据的, 数据会丢失, 磁盘会被格式化 sudo mkfs.ext4 /dev/sdb2. 设置自动挂载 [roottb …

分享90个行业PPT,总有一款适合您

分享90个行业PPT&#xff0c;总有一款适合您 90个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1bHvhk_42-IFAjNdjPPtMZw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

题目描述 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 题目示例 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&a…

LINUX系统备份管理

一、centos7系统备份与还原 1、使用tar命令备份 tar打包命令的特点&#xff1a; 保留权限 适合备份整个目录 可以选择不同的压缩方式 如果选择不压缩还能实现增量备份&#xff0c;部份还原&#xff0c;参考man tar 因为Linux类系统不像windows,它不会限制ROOT用户存取任…

Java高级-多线程

多线程 1.线程创建的方法1.1.方法一 继承Thread类1.2.方法二 实现Runnable接口1.3.方法三 实现Callable接口 2.线程安全2.0.线程不安全的案例2.1.方式一&#xff1a;同步代码块2.2.方式二&#xff1a;同步方法2.3.方式三&#xff1a;Lock锁 3.线程池3.1.创建线程池3.2.线程池处…

B2078 含 k 个 3 的数(洛谷)

题目描述 输入两个正整数 m 和 k&#xff0c;其中 1<m≤&#xff0c;1<k≤15 &#xff0c;判断 m 是否恰好含有 k 个 3&#xff0c;如果满足条件&#xff0c;则输出 YES&#xff0c;否则&#xff0c;输出 NO。 输入格式 输入一行&#xff0c;为两个整数 m,k&#xff0…