Java大師成長計劃之第13天:Java中的響應式編程

📢 友情提示:

本文由銀河易創AI(https://ai.eaigx.com)平臺gpt-4o-mini模型輔助創作完成,旨在提供靈感參考與技術分享,文中關鍵數據、代碼與結論建議通過官方渠道驗證。

隨著現代應用程序的復雜性增加,以傳統的阻塞式編程模式進行開發已無法滿足需求。響應式編程(Reactive Programming)作為一種新的編程范式,能夠提供更高的性能和更好的用戶體驗。Java社區中,RxJava和Reactor是實現響應式編程的兩大流行庫。本文將詳細介紹響應式編程的基本概念、RxJava和Reactor的核心思想及其在實際開發中的應用。

一、響應式編程簡介

響應式編程(Reactive Programming)是一種以異步數據流為基礎的編程范式,它強調在數據變化時及時作出反應。響應式編程的廣泛應用是為了滿足現代應用程序,對性能和可伸縮性的需求,尤其是在分布式系統和移動應用中尤為重要。相較于傳統的阻塞式編程模式,響應式編程更具靈活性和可擴展性,使開發者能夠應對復雜的用戶交互和實時數據處理場景。

1.1 響應式編程的核心思想

響應式編程的核心思想主要體現在以下幾個方面:

1.1.1 異步與非阻塞

響應式編程的一個顯著特點是通過異步編程來處理任務,避免因某個操作的完成而阻塞后續操作。這種方式使得系統能夠更高效地利用資源,特別是在高并發場景下,能夠減少等待時間,提高整體性能。例如,網絡請求、文件處理等IO密集型操作,可以在請求發起后立即返回,而不阻塞主線程進行工作。

1.1.2 數據流與變化傳播

在響應式編程中,數據被視為流(Stream),而不是單一的值。數據流的變化能夠通過訂閱模式(Publish-Subscribe Pattern)進行自動傳播。每當流中的數據發生變化時,所有依賴該數據的地方都會自動更新。這種模式為了增加響應系統的靈活性和可維護性,開發者不需要手動管理數據的變化,而是依賴于框架的觀察者模式(Observer Pattern)來處理數據流的變化。

1.1.3 解耦合

響應式編程提供了一種優雅的方式來降低系統各部分之間的耦合。通過將數據生產者與消費者解耦,系統的各個部分可以獨立演變和更新而不影響其他部分。這不僅提高了系統的可擴展性,還使得代碼的可測試性和可維護性得到了增強。

1.2 響應式編程的優勢

響應式編程在現代軟件開發中,有著顯著的優勢:

1.2.1 提高性能

由于響應式編程采用異步的方式來處理操作,一定程度上減少了資源的浪費,從而提高了系統的整體性能。系統能夠更快地響應用戶的請求,滿足高并發的需求。

1.2.2 增強用戶體驗

當應用能夠迅速響應用戶操作,如表單提交或數據查詢時,用戶的體驗也得到改善。金融交易、實時消息應用等場景中的用戶體驗尤其受到響應式編程理念的推動。

1.2.3 更好的可維護性

響應式編程通過使用數據流和事件驅動的模型,使得代碼更具可讀性,減少了傳統編程中復雜的狀態管理問題。程序邏輯更加清晰,且各組件之間的變化不會導致連鎖反應,從而降低了維護成本。

1.3 響應式編程的應用場景

響應式編程被廣泛應用于各種場景,尤其是在以下領域:

1.3.1 Web應用

現代Web應用需要響應快速,底層機制通常需要支持異步處理和數據流管理。使用響應式編程,可以方便地實現用戶界面與后端服務的數據交互,提升整體性能。

1.3.2 移動應用

在移動應用中,響應式編程可以幫助處理多種異步事件(如網絡請求、用戶輸入等),從而提升應用的實時響應能力。特別是在需要頻繁更新UI的情況下,響應式編程能夠提供良好的用戶體驗。

1.3.3 微服務架構

在微服務架構中,各個服務之間通常需要異步通信。通過實現響應式編程,可以更好地實現服務之間的解耦和獨立性,同時提高系統處理請求的能力,使得整個系統在高負載下也能保持高可用性。

1.4 總結

響應式編程作為一種新興的編程范式,越來越受到開發者的關注。其核心思想基于異步非阻塞處理的數據流,強調解耦和實時響應。在現代軟件架構中,尤其是在需要高并發和實時交互的系統中,響應式編程能夠為開發者提供良好的方法論,提升應用程序的性能與用戶體驗。

通過學習和掌握響應式編程的基本概念和實現手段,開發者能夠更加輕松地應對復雜應用的開發,從而更好地迎接技術的挑戰。在本篇博文的后續部分,我們將深入探討 RxJava 和 Reactor 等 Java 響應式編程庫,幫助你在實際項目中實現響應式編程的優勢。

二、RxJava

2.1 RxJava概述

RxJava 是一個用于 Java 的響應式編程擴展庫,實現了響應式編程的基本理念,能夠幫助開發者輕松地處理數據流、事件流和異步流程。它最初是由 Netflix 團隊為了解決其微服務架構下的異步數據處理問題而創建的。通過 RxJava,開發者可以更便捷地實現復雜的異步操作與數據變換,提高系統的可維護性和擴展性。

RxJava 的設計理念遵循了觀察者模式(Observer Pattern),采用發布-訂閱模式,允許對象之間的低耦合,從而使得系統更加靈活。

2.2 RxJava的核心概念

在 RxJava 中,有幾個核心概念是理解其運作機制的基礎:

2.2.1 Observable

Observable?是 RxJava 數據流的基本組成部分。它代表了可以發出數據的對象。通過?Observable,你可以創建一個可以被觀察的數據流,也可以是同步或異步的數據源。一個?Observable?可以發出多個數據項、錯誤通知或完成信號。在某些情況下,它甚至可以表示無限的數據流。

Observable<String> observable = Observable.just("Hello", "RxJava");

在上面的代碼中,我們使用?Observable.just?創建了一個發出兩個字符串數據的?Observable

2.2.2 Observer

Observer?是一個用于接收?Observable?發出數據的對象。它會訂閱?Observable,并實現用于處理接收到的數據的方法。在 RxJava 中,Observer?接受數據、錯誤信息以及完成的通知。

Observer<String> observer = new Observer<String>() {@Overridepublic void onNext(String value) {System.out.println("Received: " + value);}@Overridepublic void onError(Throwable e) {System.err.println("Error: " + e);}@Overridepublic void onComplete() {System.out.println("Completed!");}
};

2.2.3 Subscription

當?Observer?訂閱?Observable?時,會創建一個?Subscription?對象,表示訂閱的鏈接。通過?Subscription?可以取消訂閱,從而停止接收數據。這在處理資源管理時十分重要,可以避免內存泄漏。

2.2.4 Scheduler

RxJava中的?Scheduler?用于控制代碼執行的線程。你可以指定?Observable?數據的發布線程和?Observer?數據的接收線程。RxJava 提供了多種調度器,例如:

  • Schedulers.io():適用于IO密集型任務,比如網絡請求或文件訪問。
  • Schedulers.computation():適用于計算密集型任務。
  • AndroidSchedulers.mainThread():用于在Android中直接操作UI線程。

2.3 RxJava的使用

2.3.1 創建 Observable

在RxJava中,創建Observable有多種方式,常見的包括:

  • 直接創建
Observable<String> observable = Observable.create(emitter -> {emitter.onNext("Item 1");emitter.onNext("Item 2");emitter.onComplete();
});

  • 從集合創建
List<String> items = Arrays.asList("Item 1", "Item 2", "Item 3");
Observable<String> observable = Observable.fromIterable(items);

2.3.2 訂閱 Observer

一旦創建了?Observable,就可以使用?subscribe?方法將?Observer?連接到數據源上:

observable.subscribe(observer);

這將啟動數據流的處理,Observer?將接收?Observable?發出的數據。

2.3.3 操作符

RxJava 提供了豐富的操作符來對數據流進行處理,包括但不限于:

  • 變換操作
    • map:將發出的每個數據項通過指定函數轉換成另一個數據項。
observable.map(String::toUpperCase).subscribe(System.out::println);

  • 過濾操作
    • filter:根據條件過濾出符合的項目。
observable.filter(item -> item.contains("1")).subscribe(System.out::println);

  • 組合操作
    • flatMap:將發出的數據項轉換為?Observable,并合并所有的數據流。

2.3.4 錯誤處理

RxJava 允許你對異常進行詳細處理,通過?onError?方法。你還可以使用?retry?操作符重試失敗的操作。

observable.map(item -> {if ("Item 2".equals(item)) throw new RuntimeException("Error encountered!");return item;}).retry(2) // 如果發生錯誤,重試兩次.subscribe(System.out::println,error -> System.err.println("Error: " + error));

2.4 組合操作

RxJava 強大的功能之一是組合多個操作,以創建復雜的數據流處理邏輯。常見的組合操作包括:

  • 合并多個 Observable
Observable.merge(observable1, observable2).subscribe(System.out::println);

  • 串行操作
Observable.concat(observable1, observable2).subscribe(System.out::println);

  • 按時間間隔發射數據
Observable.interval(1, TimeUnit.SECONDS).subscribe(System.out::println);

2.5 實際應用案例

通過一個綜合案例,展示如何在實際應用中使用 RxJava:

import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.schedulers.Schedulers;public class RxJavaExample {public static void main(String[] args) {Observable<String> observable = Observable.create(emitter -> {try {for (int i = 1; i <= 5; i++) {Thread.sleep(1000); // 模擬延遲emitter.onNext("Item " + i);}emitter.onComplete();} catch (Exception e) {emitter.onError(e);}});observable.subscribeOn(Schedulers.io()) // 指定發射數據的線程.observeOn(Schedulers.computation()) // 指定觀察者接收數據的線程.subscribe(item -> System.out.println("Received: " + item), // 成功接收數據error -> System.err.println("Error: " + error), // 接收錯誤() -> System.out.println("Completed!") // 數據流完成);try {Thread.sleep(6000); // 主線程休眠以保證觀察者能接收到數據} catch (InterruptedException e) {e.printStackTrace();}}
}

在上面的例子中,我們創建了一個?Observable,它會每秒發出一個數據項。通過指定調度器,確保數據的發射和接收在合適的線程中進行,從而保證系統的響應性。

2.6 總結

RxJava 是一個功能強大的響應式編程庫,能夠讓 Java 開發者以簡練的方式處理異步數據流。通過理解 RxJava 的核心概念和常用操作,開發者能夠用更清晰、高效的方式編寫響應式應用,實現復雜任務的異步執行,優化代碼的可讀性和可維護性。掌握 RxJava 是成為現代 Java 大師的重要一步。

三、Reactor

3.1 Reactor概述

Reactor 是由 Pivotal 開發的一個響應式編程框架,旨在為 Java 開發者提供一種更靈活和高效的方式來處理異步數據流和事件驅動的編程模型。作為響應式編程的一部分,Reactor 是符合?Reactive Streams?規范的實現,專為構建現代高性能的應用程序而設計,尤其是在微服務架構和 Spring 生態系統中得到了廣泛應用。

Reactor 的核心組成是?Mono?和?Flux?兩個類,分別用于處理單個元素和多個元素的數據流。在許多方面,Reactor 提供了更強大、更簡潔的 API,這使得它在復雜數據處理方面表現得更加優越。

3.2 Reactor的核心概念

3.2.1 Mono

Mono?是 Reactor 中一個重要的概念,表示一個可以發出零個或一個數據的異步流。適用于那些可能沒有結果(如不返回任何數據的操作)或僅需返回一個結果的場景。

Mono<String> mono = Mono.just("Hello, Reactor!");

在上面的示例中,我們使用?Mono.just?創建了一個發出單個字符串 "Hello, Reactor!" 的?Mono?對象。

3.2.2 Flux

Flux?是 Reactor 中的另一個核心概念,代表了一個可以發出 0 到 N 個數據的異步流。也就是說,Flux?可以處理多個數據項。它通常用于更復雜的場景,如處理集合、數據流等。

Flux<String> flux = Flux.just("Item 1", "Item 2", "Item 3");

在此示例中,通過?Flux.just?創建了一個發出三個字符串的?Flux?對象。

3.2.3 訂閱

要使用?Mono?或?Flux,需要進行訂閱。在 subscribe() 方法中定義如何處理數據、錯誤以及完成信號。

flux.subscribe(item -> System.out.println("Received: " + item), // 成功接收數據error -> System.err.println("Error: " + error), // 接收錯誤() -> System.out.println("Completed!") // 流結束指示
);

3.2.4 操作符

Reactor 提供了豐富的操作符來處理和轉化數據流,開發者可以使用這些操作符簡化數據處理邏輯。常用的操作符包括:

  • 變換操作
    • map:可以對流中的每個元素進行變換。
flux.map(String::toUpperCase).subscribe(System.out::println);

  • 過濾操作
    • filter:可以根據條件過濾出流中的數據項。
flux.filter(item -> item.contains("1")).subscribe(System.out::println);

  • 合并操作
    • merge?和?concat?可以合并多個?Mono?或?Flux
Flux<String> mergedFlux = Flux.merge(flux1, flux2);

  • 錯誤處理
    • onErrorResume?用于優雅地處理錯誤。
flux.onErrorResume(e -> Mono.just("Fallback string")).subscribe(System.out::println);

3.3 Reactor的調度

Reactor 通過調度器(Scheduler)來管理代碼在不同線程上的執行。調度器為異步操作提供了靈活性。你可以使用以下調度器:

  • **Schedulers.immediate()**:在調用線程上執行任務。
  • **Schedulers.single()**:在單線程上執行任務。
  • **Schedulers.elastic()**:根據需要創建線程,適合于 IO 密集型任務。
  • **Schedulers.parallel()**:在多個線程上執行任務,適合于 CPU 密集型任務。
  • **Schedulers.boundedElastic()**:適合處理大量小線程的情況。

這些調度器分別適用于不同的場景,幫助開發者優化性能。

示例調度:

flux.subscribeOn(Schedulers.elastic()).observeOn(Schedulers.parallel()).subscribe(System.out::println);

在上面的代碼中,我們指定了?Flux?的發射線程為?Schedulers.elastic()?和處理線程為?Schedulers.parallel()

3.4 Reactor的示例應用

下面是一個簡單的示例,演示如何在 Reactor 中處理異步任務:

import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;public class ReactorExample {public static void main(String[] args) {Flux<String> flux = Flux.create(sink -> {try {for (int i = 1; i <= 5; i++) {Thread.sleep(1000); // 模擬延遲sink.next("Item " + i);}sink.complete();} catch (Exception e) {sink.error(e);}});flux.subscribeOn(Schedulers.boundedElastic()) // 指定發射數據的線程.publishOn(Schedulers.parallel()) // 指定觀察者接收數據的線程.subscribe(item -> System.out.println("Received: " + item), // 成功接收數據error -> System.err.println("Error: " + error), // 接收錯誤() -> System.out.println("Completed!") // 數據流完成);try {Thread.sleep(6000); // 主線程休眠以確保觀察者能接收到數據} catch (InterruptedException e) {e.printStackTrace();}}
}

在這個例子中,我們創建了一個?Flux,它每秒發出一個數據項。通過指定調度器來管理線程,使得數據的發射和接收能夠更加合理地運行。

3.5 Reactor的高級特性

Reactor 還支持一些高級特性,幫助開發者處理更復雜的異步場景。這些特性包括:

3.5.1 合并和組合

Reactor 提供了多種運算符來組合多個流,如?zipmergecombineLatest?等,讓你能夠靈活地處理多個數據流。

3.5.2 背壓機制

Reactor 內部實現了背壓機制,允許消費者根據自身處理能力來控制數據的流速。通過?onBackpressureBuffer?等操作符,可以實現平滑的數據流動,避免因消費速度過慢導致的內存溢出。

3.5.3 適配器與集成

Reactor 還提供了各種適配器,能夠與其他異步框架進行集成(如 WebFlux 中集成 Servlet、JDBC 支持等),讓開發者能夠利用現有的異步特性,快速構建基于響應式模型的應用。

3.6 總結

Reactor 是一個強大的響應式編程庫,能夠幫助開發者高效、優雅地處理異步數據流和事件驅動的應用。通過理解 Reactor 的核心理念和使用方法,開發者可以在構建現代 Web 應用、微服務和高并發系統時,充分發揮自由和靈活的優勢。

掌握 Reactor 的相關特性不僅能提高你的編程能力,還能幫助你迎接當今技術挑戰。隨著對響應式編程的深入了解,你將能夠構建出既高效又具有良好用戶體驗的高性能應用。在接下來的部分中,我們將深入探討如何將 RxJava 和 Reactor 融合應用于實際項目中,為你的 Java 大師成長計劃添磚加瓦。

四、RxJava與Reactor的比較

RxJava與Reactor都是實現響應式編程的重要工具,并且各自在 Java 生態系統中占有重要的地位。盡管兩者有許多相似之處,但它們在設計理念、用法和特性上也存在一些顯著的差異。下面將從多個方面對這兩者進行比較,以幫助開發者根據具體場景選擇合適的庫。

4.1 設計理念與目的

4.1.1 RxJava

RxJava 是基于觀察者模式的響應式擴展庫,最初是為了解決 Netflix 的異步數據處理需要而設計。RxJava 的重點在于支持多種異步任務的輕松組合,通過強大的流操作符(如?mapflatMapfilter?等)使得開發者能夠以函數式編程的方式處理數據流。RxJava 采用的是 "hot" 和 "cold" 觀察者,能夠高效地處理實時數據和事件。

4.1.2 Reactor

Reactor 則是在響應式編程理念的基礎上,根據 Spring 生態系統的需求而設計的。它旨在為 Java 開發者提供一種更加現代化、更易于使用的 API,以便在高并發和異步操作的場景下構建高效能的應用程序。Reactor 的設計更加注重背壓機制,確保流的控制更加精細化,有助于處理高負載場景。

4.2 數據流類型

4.2.1 RxJava

在 RxJava 中,Observable?是基礎的數據流類型,用于表示多個發出的數據。你可以選擇創建?Single(單一對象)、Maybe(零或一個對象)和?Completable(僅表示完成或錯誤)等多種數據類型,提供了較強的靈活性。

4.2.2 Reactor

Reactor 使用?Mono?和?Flux?來分別表示單個和多個數據流。這樣的區分使得代碼更加清晰,同時也使得錯誤處理和響應邏輯更易于理解。Reactor 在處理復雜數據流和組合操作時表現得更直觀。

4.3 錯誤處理

4.3.1 RxJava

RxJava 提供了?onError?方法用于處理錯誤,但處理邏輯相對基礎。開發者可以使用?retry?來重試操作,或使用?onErrorResume?來提供后備方案。

4.3.2 Reactor

Reactor 的錯誤處理更為靈活且強大,允許開發者詳細指定錯誤處理邏輯。通過?doOnError?和?onErrorReturn,開發者可以更細粒度地控制錯誤傳播。

4.4 背壓機制

4.4.1 RxJava

RxJava 在處理背壓時相對簡單,雖然也支持反壓力特性,但需要依賴開發者的具體實施方式,可能會導致在高負載情況下繼續發出請求,影響系統穩定性。

4.4.2 Reactor

Reactor 內建了背壓機制,能夠自動控制數據流的速率,較好地防止超出處理能力的情況。使用?onBackpressureBuffer?等操作符,開發者可以靈活地管理流速,確保系統的健壯性。

4.5 生態系統與集成

4.5.1 RxJava

由于它的流行性,RxJava 可以與多種開發環境和框架進行集成,特別是在 Android 中,RxJava 被廣泛應用于處理 UI 事件和異步請求。

4.5.2 Reactor

Reactor 與 Spring 生態系統有著深度的結合,特別是與 Spring WebFlux 的整合,使其成為構建高效 Web 應用的理想選擇。Reactor 提供了用于編寫響應式 Web 應用和服務的專用 API,使得開發者能夠更輕松地構建高性能的微服務架構。

4.6 性能對比

在性能方面,由于背壓機制的優化,Reactor 在高并發場景下的表現往往優于 RxJava。因其底層實現更加輕量,Reactor 有助于節省內存開銷,并提高整體并發處理能力。

4.7 選擇指南

  • 選擇 RxJava:如果項目需要在 Android 應用中處理異步任務,并且已經依賴于 RxJava 的相關操作符,可以優先選擇 RxJava。
  • 選擇 Reactor:對于基于 Spring 的后端服務,或者需要更高性能和更好背壓控制的場合,Reactor 無疑是更合適的選擇。

4.8 總結

RxJava 與 Reactor 各有優劣,選擇合適的工具應根據具體的用例、項目需求和團隊的技術棧來決定。掌握這兩者的特點和實用場景,對開發者構建高性能、響應迅速的現代應用至關重要。

五、總結

響應式編程作為現代軟件開發的重要范式,提供了一種高效的方式來處理異步數據流和事件驅動的邏輯。在 Java 生態中,RxJava 和 Reactor 作為兩大主要實現,各自展現出了強大的能力,尤其在處理高并發和可擴展性方面表現卓越。

通過理解響應式編程的基本概念,自如運用 RxJava 和 Reactor,開發者能夠:

  1. 提升應用性能:通過非阻塞和異步方式,提升系統的響應和吞吐能力,能夠處理更多的請求而不消耗過多資源。

  2. 改善用戶體驗:降低用戶等待時間,使應用對于輸入和交互的響應更加迅速,提升整體的用戶滿意度。

  3. 加強代碼可讀性和可維護性:響應式編程使得復雜邏輯的實現更加簡潔清晰,各個組件間解耦,提高代碼的可讀性和可維護性。

  4. 適應現代開發需求:通過對 RxJava 和 Reactor 的掌握,開發者可以更靈活地應對微服務、實時數據流處理等現代應用的挑戰。

未來,隨著新技術的不斷發展和業務需求的日益復雜,響應式編程的需求和重要性將會愈加凸顯。持續深入學習和實踐 RxJava 和 Reactor,開發者將能夠在這條成長之路上不斷進步,逐步成為 Java 大師。希望本文能夠為你在響應式編程的旅程中提供一定的幫助和啟發。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81897.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為私有協議Hybrid

實驗top圖 理論環節 1. 基本概念 Hybrid接口&#xff1a; 支持同時處理多個VLAN流量&#xff0c;且能針對不同VLAN配置是否攜帶標簽&#xff08;Tagged/Untagged&#xff09;。 核心特性&#xff1a; 靈活控制數據幀的標簽處理方式&#xff0c;適用于復雜網絡場景。 2. 工作…

K8s 常用命令、對象名稱縮寫匯總

K8s 常用命令、對象名稱縮寫匯總 前言 在之前的文章中已經陸續介紹過 Kubernetes 的部分命令&#xff0c;本文將專題介紹 Kubernetes 的常用命令&#xff0c;處理日常工作基本夠用了。 集群相關 1、查看集群信息 kubectl cluster-info # 輸出信息Kubernetes master is run…

【HDLBits刷題】Verilog Language——1.Basics

目錄 一、題目與題解 1.Simple wire&#xff08;簡單導線&#xff09; 2.Four wires&#xff08;4線&#xff09; 3.Inverter&#xff08;逆變器&#xff08;非門&#xff09;&#xff09; 4.AND gate &#xff08;與門&#xff09; 5. NOR gate &#xff08;或非門&am…

C語言|遞歸求n!

C語言| 函數的遞歸調用 【遞歸求n!】 0!1; 1!1 n! n*(n-1)*(n-2)*(n-3)*...*3*2*1; 【分析過程】 定義一個求n&#xff01;的函數&#xff0c;主函數直接調用 [ Factorial()函數 ] 1 用if語句去實現&#xff0c;把求n!的情況列舉出來 2 if條件有3個&#xff0c;n<0; n0||n…

Android第四次面試總結之Java基礎篇(補充)

一、設計原則高頻面試題&#xff08;附大廠真題解析&#xff09; 1. 單一職責原則&#xff08;SRP&#xff09;在 Android 開發中的應用&#xff08;字節跳動真題&#xff09; 真題&#xff1a;“你在項目中如何體現單一職責原則&#xff1f;舉例說明。”考點&#xff1a;結合…

OpenHarmony GPIO應用開發-LED

學習于&#xff1a; https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-develop.md https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-des.md 通過OpenHarmony官方文檔指導可獲知&#xff1a;芯片廠…

XILINX原語之——xpm_fifo_async(異步FIFO靈活設置位寬、深度)

目錄 一、"fwft"模式&#xff08;First-Word-Fall-Through read mode&#xff09; 1、寫FIFO 2、讀FIFO 二、"std"模式&#xff08;standard read mode&#xff09; 1、寫FIFO 2、讀FIFO 調用方式和xpm_fifo_sync基本一致&#xff1a; XILINX原語之…

系統學習算法:動態規劃(斐波那契+路徑問題)

題目一&#xff1a; 思路&#xff1a; 作為動態規劃的第一道題&#xff0c;這個題很有代表性且很簡單&#xff0c;適合入門 先理解題意&#xff0c;很簡單&#xff0c;就是斐波那契數列的加強版&#xff0c;從前兩個數變為前三個數 算法原理&#xff1a; 這五步可以說是所有…

《讓內容“活”起來:Flutter社交應用瀑布流布局的破界實踐》

用戶動態的展示方式如同舞臺的布景&#xff0c;直接影響著觀眾——用戶的體驗。而瀑布流布局&#xff0c;以其獨特的美感和高效的信息展示能力&#xff0c;成為眾多社交應用的心頭好。當我們滑動著Instagram、Pinterest&#xff0c;或是國內熱門的小紅書&#xff0c;那種內容如…

微機控制技術復習【一】

填空題&#xff1a; 簡答題&#xff1a; 1、什么是計算機控制系統?其典型形式有哪些? 2、給出 DDC &#xff08;直接數字控制&#xff09;控制系統結構框圖&#xff0c;并說明各組成部分的作用&#xff1f; 3、采樣周期選擇的理論依據是什么?工程應用中應如何選擇?選擇采樣…

前端學習基礎—VScode環境配置及html基礎知識

作為初學者&#xff0c;一個好的開發環境能極大地提高理解與學習的效率&#xff0c;本文分享我的VScode環境配置方法&#xff0c;涵蓋插件、主題、快捷鍵等&#xff0c;希望能助你快速搭建舒適邊界的前端學習環境。 一、VSCode環境配置 首先找到vscode插件商店&#xff0c;在這…

【一】 基本概念與應用領域【830數字圖像處理】

考綱 文章目錄 1 概念2005甄題【名詞解釋】2008、2012甄題【名詞解釋】可考題【簡答題】可考題【簡答題】 2 應用領域【了解】2.1 伽馬射線成像【核醫學影像】☆2.2 X射線成像2.3 紫外波段成像2.4 可見光和紅外波段成像2.5 微波波段成像2.6 無線電波段成像2.7 電子顯微鏡成像2…

QuecPython錯誤碼匯總

QuecPython中定義的各種錯誤代碼常量 錯誤碼常量錯誤碼釋義QUEC_PY_FAIL-1Generic failure codesQUEC_PY_OK0Quec_py value indicating success (no error)QUEC_PY_EPERM1Operation not permittedQUEC_PY_ENOENT2No such file or directoryQUEC_PY_ESRCH3No such processQUEC_…

C++學習-入門到精通-【4】函數與遞歸入門

C學習-入門到精通-【4】函數與遞歸入門 函數與遞歸入門 C學習-入門到精通-【4】函數與遞歸入門一、 數學庫函數sqrt()ceil()cos()exp()fabs()floor()fmod()log()log10()pow()sin()tan()總結 二、具有多個形參的函數定義三、函數原型、函數簽名和實參的強制類型轉換函數原型函數…

天線測試報告解讀學習

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、無源測試和有源測試二、無源測試報告1.駐波2.回損3.史密斯圓圖4.效率5.增益6.天線方向圖7.天線隔離度8.無源測試總結 三、有源測試報告1.TRP與TIS2.測試指標…

GEC6818蜂鳴器驅動開發

相關知識&#xff1a;Linux設備驅動開發 insmod 編譯好的.ko文件后再運行beep_app.c編譯完成的可執行文件即可使板子蜂鳴。 beep_drv.c: #include <linux/module.h> //包含了加載模塊時需要使用的大量符號和函數聲明 #include <linux/kernel.h> //包含了printk內…

電腦定時管家!Wise Auto Shutdown 深度測評:多任務執行 + 靈活定時

各位電腦小達人&#xff0c;今天給大家介紹一款超厲害的Windows系統定時任務管理工具——Wise Auto Shutdown&#xff01;這玩意兒就像電腦的貼心小管家&#xff0c;能自動執行關機、重啟這些操作&#xff0c;時間設定靈活得很&#xff0c;還有提醒機制呢。下面我給大家好好嘮嘮…

vscode 配置qt

工具&#xff1a;vscode、qttools、qtconfigure Search Mode改成基于cmake的。 # 在項目中指定Qt的路徑 set(Qt5_DIR "/home/jp/qt-everywhere-src-5.12.9/arm-qt/lib/cmake/Qt5") # 用于指定 Qt5 的安裝路徑 find_package(Qt5 REQUIRED COMPONENTS Widgets)這樣就…

基于Boost庫、Jsoncpp、cppjieba、cpp-httplib等構建Boost搜索引擎

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;項目 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 項目背景技術棧和項目環境正排索引和倒排索引數據去標簽與清洗下載數據源去標簽 建立索引構建正排索引構建倒排索引 建立搜索引擎h…

QMK機械鍵盤固件開發指南:從源碼到實踐

QMK機械鍵盤固件開發指南&#xff1a;從源碼到實踐 前言 QMK&#xff08;Quantum Mechanical Keyboard&#xff09;是一款開源的鍵盤固件&#xff0c;支持眾多自定義鍵盤的功能配置。通過QMK&#xff0c;您可以完全掌控鍵盤的每一個按鍵&#xff0c;實現復雜的宏指令、多層按…