999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

如何用Java回調和線程實現異步調用

2013-12-31 00:00:00錢宇虹
軟件工程 2013年10期

摘要:異步調用是一種非阻塞式調用方式,用于在處理比較耗時的任務時保證程序性能不受到影響。實現異步調用的關鍵在于要解決三個技術問題,它們分別是程序阻塞問題、異步消息的傳遞問題和超時問題。本文介紹的開發方法和步驟采用并發線程、回調機制和計時器圓滿地解決了異步調用的技術難題。

關鍵詞:程序阻塞;異步消息傳遞;Java回調;線程;異步調用

中圖分類號:TP311 文獻標識碼:A

軟件模塊之間的調用關系可以分為兩大類:即同步調用和異步調用。在同步調用中,一段代碼(主調方)調用另一段代碼(被調方),主調方必須等待這段代碼執行完成返回結果后,才能繼續往下執行,所以,同步調用是一種阻塞式調用,主調方代碼一直阻塞等待直到被調方返回為止。同步調用相對比較直觀,也是大部分編程語言直接支持的一種調用方式。但是,同步調用在處理比較耗時的情況下會嚴重影響程序性能,影響人機交互的瞬時反應。例如,某個程序需要訪問數據庫獲取大量數據,然后根據這些數據進行一系列處理,將處理結果顯示在程序主窗口。由于數據庫訪問和大量數據的處理都是耗時的工作,在這個工作完成之前,處理結果遲遲不能顯示,用戶點擊鼠標也不會立即得到響應,讓用戶感到整個程序顯得很沉重。面對這樣一些需要比較長時間才能完成的應用場景,我們需要采用一種非阻塞式調用方式,即異步調用方式。在異步調用中,主調方調用被調方后,不等待對方返回結果就繼續執行后續代碼,被調方執行完畢后,通過某種手段通知調用方:結果已經出來,請酌情處理。我們可以對上面的例子改用異步調用將問題輕松化解:把整個耗時的工作放進一個單獨的線程,由主調方啟動此線程后繼續執行后續代碼,線程在背后悄悄地處理費時的工作,當工作完成,采用回調的方式通知主調方工作完成,主調方將結果顯示在主窗口。經過這樣的處理,主界面繼續進行自己的工作而不必死等,就不會造成界面響應遲鈍。

在實現異步調用機制時,除了線程之外,還要用到回調。回調是一種雙向調用,也就是,被調方在被調用時也會調用主調方的代碼。在異步調用中,被調方需要在工作完成時通知主調方,即調用主調方的接口,這一機制通過回調實現。回調和異步調用的關系非常緊密,回調是異步調用的基礎[1]。

本文理論聯系實際,首先闡述如何使用Java實現回調機制,然后進一步闡述使用Java回調和線程實現異步調用,最后,闡述在異步調用中如何處理超時問題。

1 Java回調機制的實現方法

實現Java回調,需要做如下三件事情:

(1)定義一個回調接口CallbackInterface

接口中聲明回調方法handle,如圖1所示,回調方法就是一個普通的方法,接收一個消息字符串或者一個封裝了數據的事件。

(2)定義一個類實現回調接口

這個類其實就是消息接收者和處理者,如圖2所示,其中:回調方法是消息發生時實際處理消息的方法,此處簡化為一條打印語句。

(3)定義消息通知者

消息通知者必須具備兩種能力,第一,它必須知道誰是消息接收者,第二,當消息發生時,它能夠回調這些接收者的回調方法。為了獲得這兩種能力,消息通知者首先必須提供一個注冊方法register, 通過注冊的方式來注冊多個對此消息或事件感興趣的對象。然后提供一個消息通知方法notifyMessage,在這個方法中調用所有消息接收者的回調方法。具體代碼如圖3所示。

上述代碼使用了一個可變數組List用于保存消息接收者,注冊的過程實際上是將消息接收者添加到這個數組,以備在需要通知消息的時候調用這些消息接收者的回調方法。

有了消息接收者和消息通知者,就可以完成消息通知機制了,圖4給出的是測試代碼。

這里有一個非常關鍵的步驟就是將消息接收者向消息通知者注冊,只有已注冊的對象才會收到消息通知。

值得一提的是,Java回調機制的使用非常廣泛, 比如Java的事件監聽器模式和觀察者模式都包含了回調機制[2],在一些框架API提供的調用中不少也是以回調的形式提供的[3]。深刻理解Java回調機制是很有裨益的。

運行結果如圖5所示。

2 使用Java回調和線程實現異步調用

線程是一個獨立的執行流,其本質是程序中一段并發執行的代碼。在異步調用機制中引入線程,在線程中完成耗時的工作,其目的是讓調用方的主線程繼續執行后續代碼而不需要等待被調方的結果返回。由于不需要等待,這樣我們就等于同時做了兩件事情,而這兩件事情分別是在不同的執行流中執行,主調者在當前的主線程中執行,被調者在另外一個線程中執行,因此提高了程序的效率,避免了界面的響應遲鈍。當被調者執行完成后,仍然采用回調通知主調者。

如圖6所示,LongTimeWorker是一個用于完成耗時工作的線程,同時又是消息通知者。其耗時工作在run方法中完成,另外提供一個注冊方法register, 和一個消息通知方法notifyMessage,在run方法的最后,即耗時工作完成以后,調用notifyMessage將消息廣播出去。

將前面的測試代碼做一點改動就可以看到異步調用的效果如圖7所示。

3 異步調用中超時問題的處理

異步調用通常都要加入超時機制,因為我們總是希望在一個指定的時間范圍內返回一個結果,即使沒有得到結果也該有個超時通知。這時我們需要使用“限時線程回調方式”,它在原有線程回調的基礎上加上一個計時器Timer以計算消耗的時間,如果時間期限到了任務還沒有執行完成即中斷線程,并將超時消息廣播出去。LongTimeWorker類需要修改部分的代碼如圖8和圖9所示。

首先LongTimeWorker線程類增加了一個構造方法,其參數是超時時間timeout,構造方法的主要任務是創建一個定時器,每秒鐘計時一次,若超時時間到則終止本線程,并廣播超時消息。LongTimeWorker線程類的第二個改變發生在其run方法中,線程一啟動立即開始計時,完成工作后停止計時,并廣播消息。

4 結束語

異步調用是一種非阻塞式調用方式,用于在處理比較耗時的任務時保證程序性能不受到影響。實現異步調用的關鍵在于要解決三個技術難題,它們分別是程序阻塞問題、異步消息的傳遞問題和超時問題。本文介紹的方法采用并發線程、回調機制和計時器使上述問題得到了圓滿解決。

參考文獻:

[1] 陳家朋.異步消息的傳遞-回調機制[EB/OL]. http://www.ibm.com/developerworks/cn/linux/l-callback/, 2003.

[2] Eric Freeman.Head First Design Pattern[M].O’Reilly Media, Inc. 2004:51-53.

[3] 羅時飛.精通Spring-深入Java EE開發核心技術[EB/OL] , 回調接口集合及其觸發順序http://book.51cto.com/art/201004/193405.htm.

作者簡介:

錢宇虹,女,計算機科學碩士.從事軟件開發與應用、軟件

工程、軟件測試技術方面的教學、科研和開發.

主站蜘蛛池模板: 亚洲精品色AV无码看| 国产亚洲欧美日本一二三本道| 日本午夜精品一本在线观看| 亚洲成人一区在线| 亚洲欧美日韩中文字幕一区二区三区| 第九色区aⅴ天堂久久香| 亚洲av无码牛牛影视在线二区| 亚洲国产成熟视频在线多多| 国产丝袜一区二区三区视频免下载| 亚洲一区免费看| 四虎永久免费地址| 九九免费观看全部免费视频| 欧美日韩精品一区二区视频| 51国产偷自视频区视频手机观看| 国产黄网永久免费| 在线观看国产小视频| a天堂视频| 少妇精品网站| 亚洲色中色| 男人天堂亚洲天堂| 欧美人人干| 亚洲天堂日本| 欧美人人干| 青青操视频在线| 国产精品美乳| 日韩午夜福利在线观看| 日韩精品一区二区三区中文无码| 亚洲色图欧美激情| 中文字幕在线看视频一区二区三区| 超碰91免费人妻| 国产拍揄自揄精品视频网站| 久久人搡人人玩人妻精品一| 啪啪免费视频一区二区| 欧美a级在线| 国产欧美中文字幕| 亚洲精品桃花岛av在线| 一级毛片免费高清视频| 2022国产91精品久久久久久| 欧美精品另类| 亚洲精品成人福利在线电影| 青青青视频蜜桃一区二区| 国产香蕉在线| 欧美无专区| 欧美一区二区三区国产精品| 国产网站免费看| WWW丫丫国产成人精品| 精品成人免费自拍视频| 国产第三区| 九色国产在线| 国产JIZzJIzz视频全部免费| 国产激情第一页| 人妻无码中文字幕第一区| 国产不卡网| 成年女人18毛片毛片免费| 国产成人综合久久| 亚洲无码四虎黄色网站| 欧美日韩久久综合| 亚洲国产精品美女| 2021无码专区人妻系列日韩| 亚洲娇小与黑人巨大交| 91亚洲免费| 亚洲中文字幕在线精品一区| 欧美精品v欧洲精品| 国产青青草视频| 99视频只有精品| 中文字幕乱码中文乱码51精品| 欧美日韩国产系列在线观看| 成年看免费观看视频拍拍| 视频二区亚洲精品| 国产成人亚洲毛片| 大学生久久香蕉国产线观看| 天堂岛国av无码免费无禁网站 | 久久黄色小视频| 国产精品99r8在线观看| AV熟女乱| 五月丁香在线视频| 免费黄色国产视频| 国产特级毛片| 亚洲最大在线观看| 高清色本在线www| 国产在线一区视频| 三区在线视频|