国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 Java Java基礎 Java回呼機制介紹

Java回呼機制介紹

Jun 17, 2020 pm 05:06 PM
java

Java回呼機制介紹

模組間呼叫

#在一個應用系統(tǒng)中,無論使用何種語言開發(fā),必然存在著模組之間的調(diào)用,調(diào)用的方式分為幾種:

(1)同步調(diào)用

#同步調(diào)用是最基本且最簡單的一種呼叫方式,類別A的方法a()呼叫類別B的方法b(),一直等待b()方法執(zhí)行完畢,a()方法繼續(xù)往下走。 這種呼叫方式適用於方法b()執(zhí)行時間不長的情況,因為b()方法執(zhí)行時間一長或直接阻塞的話,a()方法的餘下程式碼是無法執(zhí)行下去的,這樣會造成整個流程的阻塞。

(2)非同步呼叫

非同步呼叫是為了解決同步呼叫可能會出現(xiàn)阻塞,導致整個流程卡住而產(chǎn)生的一種呼叫方式。 類別A的方法方法a()透過新起執(zhí)行緒的方式呼叫類別B的方法b(),程式碼接著直接往下執(zhí)行#,這樣無論方法b()執(zhí)行時間多久,都不會阻塞住方法a()的執(zhí)行。

但是這種方式,由於方法a()不等待方法b()的執(zhí)行完成,在方法a()需要方法b()執(zhí)行結(jié)果的情況下(視具體業(yè)務而定,有些業(yè)務例如啟非同步執(zhí)行緒發(fā)個微信通知、刷新一個快取這種就沒必要),必須透過一定的方式對方法b()的執(zhí)行結(jié)果進行監(jiān)聽。

(3)回呼

?

#最後是回呼,回呼的想法是:

  • #類別A的a()方法呼叫類別B的b()方法
  • #類別B的b()方法執(zhí)行完畢主動呼叫類A的callback()方法

這樣一種呼叫方式組成了上圖,也就是一種雙向的呼叫方式。

程式碼範例

#接下來看一下回呼的程式碼範例,程式碼模擬的是這樣一個場景:老師問學生問題,學生思考完畢回答老師。

先定義一個回呼接口,只有一個方法tellAnswer(int answer),也就是學生思考完畢告訴老師答案:

/**
?*?回調(diào)接口,原文出處http://www.cnblogs.com/xrq730/p/6424471.html
?*/
public?interface?Callback?{

????public?void?tellAnswer(int?answer);

}

定義一個老師對象,實作Callback介面:

/**
?*?老師對象,原文出處http://www.cnblogs.com/xrq730/p/6424471.html
?*/
public?class?Teacher?implements?Callback?{

????private?Student?student;

????public?Teacher(Student?student)?{
????????this.student?=?student;
????}

????public?void?askQuestion()?{
????????student.resolveQuestion(this);
????}

????@Override
????public?void?tellAnswer(int?answer)?{
????????System.out.println("知道了,你的答案是"?+?answer);
????}

}

老師對像有兩個public方法:

(1)回呼介面tellAnswer(int answer),也就是學生回答完畢問題之後,老師要做的事情

(2)問問題方法askQuestion(),即向?qū)W生問問題

接著定義一個學生接口,學生當然是解決問題,但是接收一個Callback參數(shù),這樣學生就知道解決完??畢問題向誰報告:

/**
?*?學生接口,原文出處http://www.cnblogs.com/xrq730/p/6424471.html
?*/
public?interface?Student?{

????public?void?resolveQuestion(Callback?callback);

}

最後定義一個具體的學生叫Ricky:

/**
?*?一個名叫Ricky的同學解決老師提出的問題,原文出處http://www.cnblogs.com/xrq730/p/6424471.html
?*/
public?class?Ricky?implements?Student?{

????@Override
????public?void?resolveQuestion(Callback?callback)?{
????????//?模擬解決問題
????????try?{
????????????Thread.sleep(3000);
????????}?catch?(InterruptedException?e)?{

????????}

????????//?回調(diào),告訴老師作業(yè)寫了多久
????????callback.tellAnswer(3);
????}

}

在解決完畢問題之後,第16行向老師報告答案。

寫一個測試類,比較簡單:

/**
?*?回調(diào)測試,原文出處http://www.cnblogs.com/xrq730/p/6424471.html
?*/
public?class?CallbackTest?{

????@Test
????public?void?testCallback()?{
????????Student?student?=?new?Ricky();
????????Teacher?teacher?=?new?Teacher(student);

????????teacher.askQuestion();

????}

}

程式碼運行結(jié)果就一行:

<span style="color: #000000;">知道了,你的答案是3<br></span>

簡單總結(jié)、分析這個例子是:

(1)老師呼叫學生介面的方法resolveQuestion,向?qū)W生提問

(2)學生解決完畢問題之後呼叫老師的回呼方法tellAnswer

這樣一套流程,構(gòu)成了一種雙向調(diào)用的關(guān)係。

程式碼分析

分析上面的程式碼,上面的程式碼我這裡做了兩層的抽象:

# (1)將老師進行抽象

  • 將老師進行抽象之後,對於學生來說,就不需要關(guān)心到底是哪位老師詢問我問題,只要我根據(jù)詢問的問題,得出答案,然後告訴提問的老師就可以了,即使老師換了一茬又一茬,對我學生而言都是沒有任何影響的

(2)將學生進行抽象

  • 將學生進行抽象之後,對於老師這邊來說就非常靈活,因為老師未必對一個學生進行提問,可能同時對Ricky、Jack、Lucy三個學生進行提問,這樣就可以將成員變數(shù)Student改為List,這樣在提問的時候遍歷Student列表進行提問,然後得到每個學生的回答即可

這個例子是一個典型的體現(xiàn)接口作用的例子,之所以這麼說是因為我想到有些朋友可能不太明白接口的好處,不太明白接口好處的朋友可以重點看一下這個例子,多多理解。

總結(jié)起來,回呼的核心就是回呼方將本身即this傳遞給呼叫方,這樣呼叫方就可以在調(diào)用完畢之後告訴回調(diào)方它想要知道的資訊?;卣{(diào)是一種想法、是一種機制,至於具體如何實現(xiàn),如何透過程式碼將回呼實現(xiàn)得優(yōu)雅、實現(xiàn)得可擴展性比較高,一看開發(fā)者的個人水平,二看開發(fā)者對業(yè)務的理解程度。

同步回呼與非同步回呼

#上面的例子,可能有人會提出這樣的疑問:

這個例子需要用什麼回呼啊,使用同步呼叫的方式,學生對象回答完畢問題之後直接把回答的答案回傳給老師對像不就好了?

這個問題的提出沒有任何問題,可以從兩個角度去理解這個問題。

首先,老師不只是想要得到學生的答案怎麼辦?

可能這個老師是個更喜歡聽學生解題思路的老師,在得到學生的答案之前,老師更想先知道學生姓名和學生的解題思路,當然有些人可以說,那我可以定義一個對象,裡面加上學生的姓名和解題思路不就好了。這個說法在我看來有兩個問題:

(1)如果老師想要的資料越來越多,那麼傳回的物件得越來越大,而使用回呼則可以進行資料分離,將一批資料放在回調(diào)方法中處理,至於哪些資料依具體業(yè)務而定,如果需要增加返回參數(shù),直接在回調(diào)方法中增加即可

(2)無法解決老師希望得到學生姓名、學生解題思路先於學生回答的答案的問題

因此我認為簡單的返回某個結(jié)果確實沒有必要使用回調(diào)而可以直接使用同步調(diào)用,但是如果有多種數(shù)據(jù)需要處理且資料有主次之分,使用回呼會是一種更合適的選擇,優(yōu)先處理的資料放在回呼方法中先處理掉。

另外一個理解的角度則更加重要,就是標題說的同步回調(diào)和非同步回調(diào)了。例子是同步回調(diào)的例子,意思是老師問Ricky問題,Ricky給答案,老師問下一個同學,得到答案之後繼續(xù)問下一個同學,這是正常的場景,但是如果我把場景改一下:

老師並不想One-By-One這樣提問,而是同時向Ricky、Mike、Lucy、Bruce、Kate五位同學提問,讓同學自己思考,哪位同學思考好了就直接告訴老師答案即可。

這種場景相當於是說,同學思考完畢完畢問題要有一個辦法告訴老師,有兩個解決方案:

(1)使用Future Callable的方式,等待非同步執(zhí)行緒執(zhí)行結(jié)果,這相當於就是同步呼叫的一種變種,因為其本質(zhì)還是方法返回一個結(jié)果,即學生的回答

(2)使用非同步回調(diào),同學回答完畢問題,呼叫回調(diào)介面方法告訴老師答案即可。由於老師物件被抽象化成了Callback接口,因此這種做法的擴展性非常好,就像之前說的,即使老師換了換了一茬又一茬,對於同學來說,只關(guān)心的是調(diào)用Callback接口回傳必要的資訊即可

?更多相關(guān)知識請關(guān)注java基礎教學欄位

以上是Java回呼機制介紹的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務,必須先關(guān)閉自動提交模式,再執(zhí)行多個操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務;2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設置保存點實現(xiàn)部分回滾,並保持事務盡可能短以提升性能。

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

了解網(wǎng)絡端口和防火牆 了解網(wǎng)絡端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動管理內(nèi)存的機制,通過回收不可達對象釋放堆內(nèi)存,減少內(nèi)存洩漏風險。 1.GC從根對象(如棧變量、活動線程、靜態(tài)字段等)出發(fā)判斷對象可達性,無法到達的對像被標記為垃圾。 2.基於標記-清除算法,標記所有可達對象,清除未標記對象。 3.採用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時較長的MajorGC;Metaspace存儲類元數(shù)據(jù)。 4.JVM提供多種GC器:SerialGC適用於小型應用;ParallelGC提升吞吐量;CMS降

使用HTML'輸入類型”作為用戶數(shù)據(jù) 使用HTML'輸入類型”作為用戶數(shù)據(jù) Aug 03, 2025 am 11:07 AM

選擇合適的HTMLinput類型能提升數(shù)據(jù)準確性、增強用戶體驗並提高可用性。 1.根據(jù)數(shù)據(jù)類型選用對應input類型,如text、email、tel、number和date,可實現(xiàn)自動校驗和適配鍵盤;2.利用HTML5新增類型如url、color、range和search,可提供更直觀的交互方式;3.配合使用placeholder和required屬性,可提升表單填寫效率和正確率,但需注意placeholder不能替代label。

以身作則http中間件記錄示例 以身作則http中間件記錄示例 Aug 03, 2025 am 11:35 AM

Go中的HTTP日誌中間件可記錄請求方法、路徑、客戶端IP和耗時,1.使用http.HandlerFunc包裝處理器,2.在調(diào)用next.ServeHTTP前後記錄開始時間和結(jié)束時間,3.通過r.RemoteAddr和X-Forwarded-For頭獲取真實客戶端IP,4.利用log.Printf輸出請求日誌,5.將中間件應用於ServeMux實現(xiàn)全局日誌記錄,完整示例代碼已驗證可運行,適用於中小型項目起步,擴展建議包括捕獲狀態(tài)碼、支持JSON日誌和請求ID追蹤。

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

See all articles