Java模擬異步消息的發(fā)送與回調(diào)
本文的目的并不是介紹使用的什么技術(shù),而是重點(diǎn)闡述其實(shí)現(xiàn)原理。
一、 異步和同步
講通俗點(diǎn),異步就是不需要等當(dāng)前執(zhí)行的動(dòng)作完成,就可以繼續(xù)執(zhí)行后面的動(dòng)作。
通常一個(gè)程序執(zhí)行的順序是:從上到下,依次執(zhí)行。后面的動(dòng)作必須等前面動(dòng)作執(zhí)行完成以后方可執(zhí)行。這就是和異步相對(duì)的一個(gè)概念——同步。
案例:
A、張三打電話給李四,讓李四幫忙寫份材料。
B、李四接到電話的時(shí)候,手上有自己的工作要處理,但他答應(yīng)張三,忙完手上的工作后馬上幫張三寫好材料,并傳真給張三。
C、通完電話后,張三外出辦事。
說明:
張三給李四通完電話后,就出去辦事了,他并不需要等李四把材料寫好才外出。那么張三讓李四寫材料的消息就屬于異步消息。
相反,如果張三必須等李四把材料寫好才能外出辦事的話,那么這個(gè)消息就屬于同步消息了。
二、 異步的實(shí)現(xiàn)
傳統(tǒng)的程序執(zhí)行代碼都是從上到下,一條一條執(zhí)行的。
但生活中有很多情況并不是這樣,以上的案例中,如果李四需要幾個(gè)小時(shí)以后才能幫張三寫好材料的話,那張三就必須等幾個(gè)小時(shí),這樣張三可能會(huì)崩潰或者抓狂。
這種一條龍似的處理,顯示不太合理。
可以使用以下辦法來處理這種問題:
張三找王五去給李四打電話,等李四寫好材料后,由王五轉(zhuǎn)交給張三。這樣張三就可以外出辦其他的事情了。
問題得到了合理的解決,之前張三一條線的工作,由張三和王五兩條線來完成了,兩邊同時(shí)進(jìn)行,彼此不耽誤。
三、 計(jì)算機(jī)語言的實(shí)現(xiàn)
辦法有了,如何用程序來模擬實(shí)現(xiàn)呢?
A、以前由一個(gè)線程來處理的工作,可以通過新增一個(gè)線程來達(dá)到異步的目的。這也就是JAVA中的多線程技術(shù)。
B、最后李四寫好的材料必須交給張三,以做他用。這就是回調(diào)。
回調(diào)你可以這樣來理解:
A發(fā)送消息給B,B處理好A要求的事情后,將結(jié)果返回給A,A再對(duì)B返回的結(jié)果來做進(jìn)一步的處理。
四、 Java代碼的實(shí)現(xiàn)
A、 回調(diào)的實(shí)現(xiàn)
Java代碼tb
public
}
public interface CallBack { public void execute(Object... objects ); }
Java是面向?qū)ο蟮恼Z言,因此回調(diào)函數(shù)就變成了回調(diào)接口。
B、 消息的發(fā)送者
Javatb代碼
public