AWS 实时数据流服务 Kinesis

news/2024/9/20 10:10:09/ 标签: 云计算, Kinesis, Lambda, Big Data, aws

AWS 实时数据流服务 Kinesis

  • 什么是 Kinesis
  • Kinesis 数据来源
  • 示例 AWS Lambda 发送数据到 Kinesis
    • 步骤 1:创建 Kinesis 数据流
    • 步骤 2:编写 Lambda 函数
    • 步骤 3:配置 Lambda 函数权限
    • 部署和测试 Lambda 函数
  • 消费和处理 Kinesis 数据流
  • 示例 Flink 处理 Kinesis 数据流
    • 环境准备
    • 设置 Flink 与 Kinesis 连接
    • 编写 Flink 程序
    • 配置 Flink 作业
    • 运行 Flink 作业
    • 使用 Flink SQL(可选)
    • 总结

Kinesis_1">什么是 Kinesis

Amazon Kinesis 是一套由 AWS 提供的服务,用于实时处理和分析流数据。它帮助用户在数据生成时捕获、处理和存储大量数据记录。Kinesis 有几个主要组件:

  1. Kinesis Data Streams: 用于实时收集和处理大规模数据流。数据可以从数百到数百万个来源流入,并且可以被多个消费者应用程序读取和实时处理。这对需要对数据进行低延迟处理的应用程序非常有用,例如日志分析、实时监控和点击流数据处理。
  2. Kinesis Data Firehose: 用于将流数据传送到 AWS 服务,如 S3、Redshift、Elasticsearch 和第三方服务如数据湖、数据仓库和分析服务中。Kinesis Firehose 可以自动调整规模并提供批处理、压缩和加密功能。它可以让用户以几乎实时的方式将数据传送到目标存储中进行分析和可视化。
  3. Kinesis Data Analytics: 用于实时分析流数据,允许用户使用 SQL 查询直接在流数据上运行实时分析。它支持从 Kinesis Data Streams 或 Kinesis Data Firehose 中读取数据,并将处理后的数据传送到其他 AWS 服务中。
  4. Kinesis Video Streams: 用于实时流式处理视频数据,可以捕获、处理和存储来自摄像头和其他设备的视频流数据。适用于实时监控、媒体分析和机器学习等应用场景。

这些组件共同构成了一个强大的平台,使用户能够以高吞吐量和低延迟的方式处理和分析实时数据流。

Kinesis__11">Kinesis 数据来源

Amazon Kinesis 数据流的来源非常广泛,可以涵盖各种实时数据生成和收集场景。以下是一些常见的 Kinesis 数据来源:

  1. 应用程序日志和事件
    Web 和移动应用: 从用户的交互、点击流、错误报告、使用统计等中产生的数据。开发者可以通过集成 Kinesis Producer Library (KPL) 或使用 AWS SDK,将这些数据直接发送到 Kinesis 数据流。
    后端服务日志: 后端服务生成的日志,包括错误日志、性能日志、交易日志等,可以通过 Kinesis Agent 或自定义代码发送到 Kinesis
    游戏数据: 游戏应用中玩家行为、游戏内事件等,可以实时发送到 Kinesis 进行分析,帮助改善游戏体验。
  2. 物联网 (IoT) 设备数据
    传感器数据: IoT 设备上的传感器(如温度、湿度、压力等)可以将采集的数据发送到 Kinesis,用于实时监控和分析。
    GPS 数据: 车辆、货物追踪设备可以发送实时位置和速度数据到 Kinesis,进行实时位置跟踪和路线优化。
    智能家居设备: 家居监控设备、智能电器等可以将状态和使用数据发送到 Kinesis,支持实时家居监控和控制。
  3. 服务器和系统日志
    应用服务器日志: Web 服务器、应用服务器、数据库服务器等生成的日志数据,如 Apache、Nginx、Tomcat、MySQL 日志,可以使用 Kinesis Agent 将日志文件实时发送到 Kinesis
    系统监控数据: 系统性能监控工具生成的指标数据,如 CPU 使用率、内存使用情况、网络流量,可以通过 Kinesis Agent 或自定义脚本发送到 Kinesis
  4. 流式数据生成器
    社交媒体数据: 实时收集和分析来自社交媒体平台的数据,如 Twitter 提到、Facebook 互动等,通过第三方 API 接口将数据流式传输到 Kinesis
    点击流数据: 网站和应用中的用户点击行为和浏览数据,可以使用自定义代码将这些事件流式传输到 Kinesis,用于实时分析用户行为。
  5. 云服务事件
    AWS CloudWatch Logs: CloudWatch 可以实时收集和监控 AWS 资源和应用的日志。通过 CloudWatch Logs Subscription,日志数据可以实时传输到 Kinesis 数据流。
    AWS Lambda: Lambda 函数可以将来自其他服务(如 S3、DynamoDB Streams、SNS)的事件数据发送到 Kinesis,支持自定义事件流处理。
  6. 数据集成工具和服务
    Fluentd/Fluent Bit: 这些日志收集和转发工具可以配置将数据发送到 Kinesis 数据流,适用于日志聚合、监控数据收集。
    Logstash: 使用 Logstash 的 Kinesis 插件,可以从各种数据源中收集数据并发送到 Kinesis,用于集中日志管理和实时分析。
    Kafka Connect: 使用 Kafka Connect 和 Kinesis 连接器,可以将 Apache Kafka 中的数据传输到 Kinesis 数据流,支持跨系统数据集成。
  7. 批量数据上传和迁移
    批处理系统: 从传统数据仓库、关系型数据库或文件系统中提取数据,将其转换为流式数据并发送到 Kinesis
    Amazon S3: 通过 S3 事件触发器,可以将新上传到 S3 的文件内容提取并发送到 Kinesis 数据流,实现批量数据到实时数据的转换。
  8. 实时数据生成
    实时监控和报警: 系统监控工具可以在检测到异常时,将报警数据发送到 Kinesis,用于实时报警和处理。
    实时分析: 数据科学家和分析师可以将实时计算结果、模型预测等数据发送到 Kinesis,用于实时分析和决策支持。
  9. 用户自定义数据生成器
    模拟数据生成器: 在开发和测试过程中,用户可以编写模拟数据生成器,向 Kinesis 发送测试数据,以验证流处理系统的性能和可靠性。
    数据采集系统: 用户可以开发自定义的数据采集系统,将各类数据源的数据实时汇集并发送到 Kinesis 数据流。
    通过这些数据来源,Kinesis 数据流能够收集和处理各种类型的实时数据,为实时分析、监控和决策支持提供基础。

Lambda__Kinesis_45">示例 AWS Lambda 发送数据到 Kinesis

要使用 AWS Lambda 将数据写入 Amazon Kinesis 数据流,可以按照以下步骤进行:

Kinesis__51">步骤 1:创建 Kinesis 数据流

在 AWS 管理控制台中创建一个 Kinesis 数据流,记下数据流的名称。

Lambda__54">步骤 2:编写 Lambda 函数

以下是一个示例 Lambda 函数,将数据写入 Kinesis 数据流:

import json
import boto3
import base64def lambda_handler(event, context):# 创建 Kinesis 客户端kinesis_client = boto3.client('kinesis', region_name='us-east-1')# Kinesis 数据流名称stream_name = 'your-kinesis-stream-name'# 示例数据data = {'id': '123','message': 'Hello, Kinesis!'}# 将数据转换为 JSON 字符串并编码为字节data_bytes = json.dumps(data).encode('utf-8')# 将数据写入 Kinesis 数据流response = kinesis_client.put_record(StreamName=stream_name,Data=data_bytes,PartitionKey='partition-key')return {'statusCode': 200,'body': json.dumps('Data sent to Kinesis')}

解释

  • boto3.client(‘kinesis’): 初始化 Kinesis 客户端。
  • put_record: 使用 put_record 方法将数据写入指定的 Kinesis 数据流。
  • StreamName: 要写入的 Kinesis 数据流名称。
  • Data: 要写入的数据,需要编码为字节。
  • PartitionKey: 用于确定数据分区的键。Kinesis 使用分区键来确定数据写入到哪个分片。

Lambda__96">步骤 3:配置 Lambda 函数权限

确保 Lambda 函数具有写入 Kinesis 数据流的权限。你可以通过以下步骤配置 IAM 角色和策略:

  1. 创建 IAM 角色:为 Lambda 函数创建一个 IAM 角色,并附加以下策略:
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": ["kinesis:PutRecord","kinesis:PutRecords"],"Resource": "arn:aws:kinesis:us-east-1:123456789012:stream/your-kinesis-stream-name"}]
}
  1. 附加角色到 Lambda 函数:在 Lambda 函数的配置中,将上述 IAM 角色附加到 Lambda 函数。

Lambda__115">部署和测试 Lambda 函数

  1. 部署 Lambda 函数:将 Lambda 函数代码部署到 AWS Lambda
  2. 测试 Lambda 函数:在 AWS 管理控制台中测试 Lambda 函数,确保数据成功写入 Kinesis 数据流。

通过上述步骤,你可以使用 AWS Lambda 将数据写入 Amazon Kinesis 数据流,实现实时数据收集和处理。根据具体的业务需求,你可以扩展 Lambda 函数的逻辑,将不同类型的数据写入 Kinesis 数据流。

Kinesis__120">消费和处理 Kinesis 数据流

Amazon Kinesis 数据流可以被多种下游服务消费和处理。这些服务可以直接从 Kinesis 数据流中读取数据,进行分析、存储或进一步处理。以下是一些常见的下游服务:

  1. AWS Lambda
    事件驱动处理: 可以将 Kinesis 数据流配置为 Lambda 函数的触发器,Lambda 会在新数据到达时自动执行。非常适用于事件驱动的应用场景,如实时数据处理、数据清洗、报警等。
    无服务器架构: Lambda 是一种无服务器计算服务,能够根据需要自动扩展以处理数据流中的记录。
  2. Amazon Kinesis Data Firehose
    数据传输: Kinesis Data Firehose 可以将 Kinesis 数据流中的数据传输到其他 AWS 服务,如 Amazon S3、Amazon Redshift、Amazon Elasticsearch Service 或第三方服务。
    自动转换和格式化: 支持在传输过程中对数据进行转换,例如转换为 JSON、Parquet 格式,或者通过 AWS Lambda 函数对数据进行自定义处理。
  3. Amazon Kinesis Data Analytics
    实时分析: Kinesis Data Analytics 可以直接从 Kinesis 数据流中读取数据,执行实时 SQL 查询或通过 Apache Flink 进行复杂的流数据处理。
    实时仪表盘: 可以用于实时分析和创建仪表盘,从而监控数据流中的关键指标。
  4. Amazon Elastic MapReduce (EMR)
    大数据处理: Kinesis 数据流可以作为 Amazon EMR 上运行的 Apache Hadoop、Spark 等大数据处理框架的输入数据源。适用于大规模批处理、机器学习和数据挖掘任务。
    直接集成: 使用 Apache Flink 或 Apache Spark Streaming 等框架可以直接读取和处理 Kinesis 数据流。
  5. Amazon Redshift
    数据仓库: 通过 Kinesis Data Firehose,可以将流数据传送到 Amazon Redshift 中,用于更复杂的分析和报告。可以在 Redshift 中运行复杂的 SQL 查询,结合其他数据源进行分析。
  6. Amazon S3
    持久化存储: 使用 Kinesis Data Firehose,将流数据持久化存储到 Amazon S3。存储在 S3 中的数据可以用于长期归档、备份,或者供其他分析工具(如 Athena、EMR、Glue)使用。
    数据湖: 将 Kinesis 数据流中的数据传输到 S3,可以作为数据湖的一部分,供后续分析和机器学习使用。
  7. Amazon Elasticsearch Service (OpenSearch)
    实时搜索和分析: 通过 Kinesis Data Firehose,可以将数据流发送到 Amazon Elasticsearch Service,用于实时搜索、分析和可视化。适用于日志分析、监控和运营洞察。
    Kibana 集成: 可以使用 Kibana 对 Elasticsearch 中的数据进行可视化。
  8. 第三方服务
    自定义接收器: 通过 Kinesis Client Library (KCL) 或者 Kinesis Data Streams API,用户可以构建自定义消费者应用,将数据流发送到其他云服务或本地系统进行处理。
    其他云服务: 可以通过中间处理或自定义集成将 Kinesis 数据流传输到其他云提供商的服务。
  9. 本地应用程序
    Kinesis Client Library (KCL): 开发者可以使用 KCL 在本地应用程序中消费和处理 Kinesis 数据流。这种方式适用于对流数据进行定制化处理、聚合或进一步传递到其他系统。

通过与这些下游服务集成,Kinesis 数据流可以支持广泛的数据处理和分析需求,从实时事件处理到大规模数据分析和持久化存储。

Kinesis__151">示例 Flink 处理 Kinesis 数据流

Apache Flink 是一个流处理框架,能够高效地处理和分析实时数据流。要使用 Flink 处理来自 Amazon Kinesis 数据流的数据,你需要设置 Flink 和 Kinesis 之间的连接,并编写处理逻辑。下面详细介绍如何使用 Flink 处理 Kinesis 数据流。

环境准备

  • Apache Flink: 你需要一个运行中的 Flink 集群,可以是本地、YARN、Kubernetes 或 Amazon Kinesis Data Analytics。
  • Amazon Kinesis: 创建一个 Kinesis 数据流用于数据输入。
  • AWS SDK 和 Flink Kinesis 连接器: 确保你的 Flink 环境中包含了与 Kinesis 集成的相关库和连接器。

Kinesis__158">设置 Flink 与 Kinesis 连接

要将 Flink 与 Kinesis 集成,你需要使用 Flink 的 Kinesis 连接器。Flink 提供了 flink-connector-kinesis 这个连接器,用于连接和读取 Kinesis 数据流。可以通过 Maven 依赖将其添加到 Flink 项目中。

Maven 依赖

<dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-kinesis_2.12</artifactId><version>1.15.0</version> <!-- 请根据需要选择版本 -->
</dependency>

编写 Flink 程序

以下是一个使用 Flink 处理 Kinesis 数据流的基本示例,使用 Java API 来读取数据流并进行简单处理。

Java 示例

import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kinesis.FlinkKinesisConsumer;
import org.apache.flink.streaming.connectors.kinesis.config.ConsumerConfigConstants;
import org.apache.flink.streaming.connectors.kinesis.config.DefaultKinesisConsumerConfig;import java.util.Properties;public class KinesisFlinkExample {public static void main(String[] args) throws Exception {// 创建 Flink 流处理环境final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 配置 Kinesis 数据流Properties properties = new Properties();properties.setProperty(ConsumerConfigConstants.AWS_REGION, "us-east-1");properties.setProperty(ConsumerConfigConstants.STREAM_INITIAL_POSITION, "LATEST");properties.setProperty(ConsumerConfigConstants.AWS_CREDENTIALS_PROVIDER, "DEFAULT");// 创建 Flink Kinesis 消费者FlinkKinesisConsumer<String> consumer = new FlinkKinesisConsumer<>("your-kinesis-stream-name",              // 数据流名称new SimpleStringSchema(),                // 数据解码模式properties);// 读取数据流DataStream<String> stream = env.addSource(consumer);// 处理数据流stream.map(record -> "Processed: " + record).print();// 执行 Flink 作业env.execute("Flink Kinesis Example");}
}

解释

  • StreamExecutionEnvironment: Flink 的流处理环境,用于创建数据流和定义处理逻辑。
  • Properties: 配置 Kinesis 消费者所需的属性,如 AWS 区域和数据流名称。
  • FlinkKinesisConsumer: Flink 提供的 Kinesis 消费者,用于从 Kinesis 数据流中读取数据。
  • SimpleStringSchema: 数据解码模式,用于将 Kinesis 数据流中的字节数据转换为字符串。根据数据的实际格式,你可能需要使用其他
  • Schema(例如 JSON、Avro 等)。

配置 Flink 作业

Kinesis 配置: 在配置 Kinesis 数据流时,需要指定 AWS 区域、流名称、初始位置等参数。根据实际需要设置 ConsumerConfigConstants 的不同属性。
数据处理: 在 map 函数中实现自定义的数据处理逻辑。可以执行各种操作,如过滤、聚合、窗口处理等。

运行 Flink 作业

将 Flink 作业打包成 JAR 文件,并将其提交到 Flink 集群中运行。你可以使用 Flink 提供的命令行工具、Flink Dashboard 或其他管理工具来提交作业。

使用 Flink SQL(可选)

如果你使用的是 Flink SQL,以下是如何通过 SQL 查询处理 Kinesis 数据流的简要示例。

SQL 查询示例

CREATE TABLE kinesis_stream (`id` STRING,`message` STRING
) WITH ('connector' = 'kinesis','stream' = 'your-kinesis-stream-name','aws.region' = 'us-east-1','format' = 'json'
);SELECT * FROM kinesis_stream

解释
CREATE TABLE: 定义一个表示 Kinesis 数据流的表。
‘connector’ = ‘kinesis’: 指定使用 Kinesis 连接器。
‘format’ = ‘json’: 数据的格式(根据实际数据格式调整)。

总结

使用 Apache Flink 处理 Kinesis 数据流需要以下步骤:
配置 Flink 和 Kinesis 连接器,确保 Flink 能够连接到 Kinesis 数据流。
编写 Flink 程序,使用 Kinesis 连接器读取数据流并进行处理。
配置和运行 Flink 作业,确保作业在 Flink 集群中执行并处理数据。
Flink 的强大功能可以帮助你实现复杂的实时数据处理任务,从而为业务提供快速的洞察和响应能力。


http://www.ppmy.cn/news/1527954.html

相关文章

英飞凌 PSoC6 RT-Thread 评估板简介

概述 2023年&#xff0c;英飞凌&#xff08;Infineon&#xff09;联合 RT-Thread 发布了一款 PSoC™ 62 with CAPSENSE™ evaluation kit 开发板 &#xff08;以下简称 PSoC 6 RTT 开发板&#xff09;&#xff0c;该开发套件默认内置 RT-Thread 物联网操作系统。PSoC 6 RTT 开…

会计稳健性Cscore模型(2000-2022年)

参考文献 甄红线, 王三法, 王晓洪. (2019). 公司债特殊条款、债券评级与会计稳健性. 会计研究, (10), 42-49.王晓亮, 蒋勇, 刘振杰. (2019). 董事会断裂带、会计稳健性与真实盈余管理. 审计研究, (05), 120-128. 会计稳健性&#xff0c;也称为会计保守性&#xff0c;是指企业…

PostgreSQL常用表操作SQL脚本整理

标题 查看 PostgreSQL表字段信息包括 名称&#xff0c;数据类型&#xff0c;精度&#xff0c;注释等信息查看数据库中的 schemas查看特定 schema 中的所有表查看指定表所有列的信息&#xff1a;查看主键信息&#xff1a;查看索引信息&#xff1a; 创建库表模板修改表信息修改表…

Vue.js 的 Mixins

Vue.js 的 Mixins 是一种非常强大且灵活的功能&#xff0c;它允许你封装可复用的 Vue 组件选项。Mixins 实际上是一种分发 Vue 组件可复用功能的非常灵活的方式。一个 mixin 对象可以包含任意组件选项。当组件使用 mixin 时&#xff0c;所有 mixin 选项将被“混入”该组件本身的…

切换淘宝最新镜像源npm

要切换淘宝的最新镜像源 npm&#xff0c;可以按照以下步骤进行操作&#xff1a; 安装 Node.js 和 npm&#xff1a; 确保你的系统中已经安装了 Node.js 和 npm。可以通过以下命令检查&#xff1a; node -v npm -v切换 npm 源&#xff1a; 使用以下命令将 npm 的源切换到淘宝镜像…

VUE工程中axios基本使用

安装axios npm install axios -s在main.js中引入 import http from axios Vue.prototype.$http = http将其绑定在VUE的prototype属性中 vue工程目录下,新建config文件夹,在config文件夹下新建index.js export default {

【Linux进程控制】进程程序替换

目录 进程程序替换 替换函数 看现象 替换原理 多进程替换 exec*函数使用&#xff08;部分&#xff09;&#xff0c;并且认识函数参数的含义 1.execl 2.execv 3.execvp 4.execvpe execlp 和execlpe 替换函数总结 进程程序替换 替换函数 有六种以exec开头的函数&am…

高德地图JS API加载行政区边界AMap.Polygon

&#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 高德AMap专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#x1f49…

PDP 和 ICE 图的终极指南

部分依赖图和单独条件期望图背后的直觉、数学和代码(R 和 Python) PDP 和 ICE 图都可以帮助我们了解我们的模型如何做出预测。 使用个人显示面板我们可以将模型特征和目标变量之间的关系可视化。它们可以告诉我们某种关系是线性的、非线性的还是没有关系。 同样,当特征之间…

Java 入门指南:JVM(Java虚拟机)—— Java 类加载器详解

类加载器 类加载器&#xff08;Class Loader&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;的一部分&#xff0c;它的作用是将类的字节码文件&#xff08;.class 文件&#xff09;从磁盘或其他来源加载到 JVM 中。类加载器负责查找和加载类的字节码文件&#xff0c;并…

通过防火墙分段增强网络安全

什么是网络分段‌ 随着组织规模的扩大&#xff0c;管理一个不断扩大的网络成为一件棘手的事情&#xff0c;同时确保安全性、合规性、性能和不间断的运行可能是一项艰巨的任务。为了克服这一挑战&#xff0c;网络管理员部署了网络分段&#xff0c;这是一种将网络划分为更小且易…

openssl-AES-128-CTR加解密char型数组分析

本文章通过对一个unsigned char*类型的数据做简单的加解密操作来学习如何使用openssl库函数。 openssl为3.0.0&#xff0c;对此前版本的很多函数都不兼容。 加解密源码 #include <openssl/evp.h> #include <openssl/err.h> #include <string.h> #include …

职场人生-外企福利待遇

今天来给大家分享一下外企的待遇&#xff0c;虽然外服享受不到这些待遇&#xff0c;但是也可以跟大家分享分享 1.四季福利.外企一般在春夏秋冬都会发印有公司logo的衣服&#xff0c;春天的外套&#xff0c;夏天的短袖&#xff0c;秋天的长袖&#xff0c;冬天的棉袄&#xff0c…

【HTML】入门教程

HTML入门 HTML网页主流浏览器及其内核W3C标准HTML结构简单示例meta HTML标签语法规则标签分类标签之间的关系标签属性通用属性&#xff1a; 常用标签及其属性应用示例 HTML5语义化标签多媒体标签视频标签 video音频标签 audio 新增的表单元素 参考文档 HTML HTML 指的是超文本…

使用llama.cpp 在推理MiniCPM-1.2B模型

llama.cpp 是一个开源项目&#xff0c;它允许用户在C中实现与LLaMA&#xff08;Large Language Model Meta AI&#xff09;模型的交互。LLaMA模型是由Meta Platforms开发的一种大型语言模型&#xff0c;虽然llama.cpp本身并不包含LLaMA模型的训练代码或模型权重&#xff0c;但它…

GPU 云与 GenAI :DigitalOcean 在 AI 平台与应用方向的技术规划

在 DigitalOcean&#xff0c;我们不仅在观察人工智能革命&#xff0c;而且还在积极参与这场技术革命。 去年&#xff0c;我们进行了一项关键的收购以扩展平台的人工智能能力&#xff0c;扩大了对曾经仅限于大型企业的 AI/ML 开发工具的访问。在2024年7月由 DigitalOcean 主办的…

道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路

道路裂缝&#xff0c;坑洼&#xff0c;病害数据集 包括无人机视角&#xff0c;摩托车视角&#xff0c;车辆视角 覆盖道路所有问题 一共有八类16000张 1到7依次为: [横向裂缝, 纵向裂缝, 块状裂缝, 龟裂, 坑槽, 修补网状裂缝, 修补裂缝, 修补坑槽] 道路病害&#xff08;如裂缝、…

问:说说notify()和notifyAll()有什么区别?

notify() 和 notifyAll() 是 Java 中用于线程间通信的方法&#xff0c;这两个方法都用于唤醒正在等待 (wait()) 的线程。然而&#xff0c;它们在工作方式和应用场景上有一些重要的区别。 notify() vs notifyAll() notify(): 唤醒一个正在等待 (wait()) 的线程。如果有多个线程…

演示:基于WPF自绘的中国省份、城市、区县矢量地图

一、目的&#xff1a;演示一个基于WPF自绘的中国省份、城市、区县矢量地图 二、效果 国 省 市 三、功能 支持实际经纬度显示 支持平移&#xff0c;缩放等功能 显示中国地图 显示各个省份地图 显示各个省份地图&#xff08;包含在表格中&#xff0c;包含缩率图&#xff09; 显…

基于单片机的远程无线控制系统设计

摘 要 &#xff1a; 主要介绍了一种以单片机 AT89C2051 、 无线模块 APC200A-43 和继电器为核心的远程智能控制系统。 该系统通过对单片机功能的研究 &#xff0c; 使用单片机的输入输出口和中断实现对控制信号的处理&#xff0c; 通过调试无线通讯模块 &#xff0c; 控制…