閉包-- 一個可調用的對象, 這個對象包含一些信息, 這些信息來自於建立他的環境, 咱們能夠在將來的某個時刻經過回調機制來得到閉包中的信息, java中的外部類就是內部類的一個閉包, 內部類則是外部類的一個指針, 且是一個安全的指針, 能夠叫作hook.java
回調-- 一個方法的指針傳遞給事件源, 事件源在事件發生以後, 反過來調用這個方法. 這個方法就叫回調函數linux
在java中, 通常經過抽象類或接口定義回調函數, 如:ajax
interface CallBackI { void callback(Object obj) ; } class A implements CallBackI { private Object obj ; public void callback(Object obj) { this.obj = obj ; } public void getInfo(B b) { b.event(this) ; } } class B { public boolean somethingHappend() { //dosomething.... return true ; } public void event(CallBackI callback) { if(somethingHappend()) callback.callback(someInfo) ; } }
A須要從B中獲取某些信息, 因而調用B的even方法, 並把本身看成參數傳遞進去, b在事件發生並處理結束(somethingHappend返回)以後, 調用a的callback方法(回調函數)將信息傳遞會a.編程
java api中的觀察者模式就是一個回調機制的例子:設計模式
public void notifyObservers(Object arg) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); }
這段代碼是Observable類中的notifyObservers方法, 他在事件發生以後回調observer的update方法來達到通知觀察者的目的api
設計模式中的好萊塢原則, 我感受也是回調機制的一種表現, 低層組件依賴於高層組件, 高層組件經過調用低層組件接口方法的形式來回調低層組件.瀏覽器
好萊塢原則是: 別打電話給咱們,有事我會打電話給你安全
依賴倒置: 依賴於抽象編程, 不要依賴於具體實現, 低層具體組件應該依賴於高層抽象組件; 我感受因而可知依賴倒置是好萊塢原則的一個實現..服務器
ajax也是回調機制的例子, 閉包
xmlhttp.open("GET","ajax_test.asp",true); xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","test1.txt",true); xmlhttp.send();
這個function就是一個回調函數, 當服務器給瀏覽器返回一個結果以後, 就會調用這個方法.
我在看回調機制的時候, 忽然想到ajax屬於異步調用, 而我寫的那個屬於同步調用(與回調機制無關) , 因而想小結一下上週對同步,異步, 阻塞式, 非阻塞式的理解
同步與異步這個概念是指消息傳遞的機制不一樣, 同步調用在沒有獲得返回結果以前不會返回, 而是主動等待這個返回結果; 而異步調用在獲得結果以前會當即返回, 也就是異步調用不會當即獲得返回結果, 而是等待被調用者給調用者一個信號, 當信號出現以後再來處理這個返回的結果
阻塞式與非阻塞式則是程序等待調用結果的方式不一樣, 阻塞式在獲得結果前, 會將自身的進程或線程掛起等待結果, 在結果數據的接收過程當中等待數據傳輸結束;而非阻塞式則是會當即返回一個結果,不會使進程或線程進入等待態.
linux的5種I/O模型
阻塞式I/O: recefrom在返回前(沒有結果), 會將進程掛起,進入等待態? , 且在進行IO時, 等待IO結束, 屬於同步IO
非阻塞式I/O: recefrom在沒有IO結果時, 會當即返回一個標誌位, 且在進行IO時, 等待IO結束, 屬於同步IO
IO複用: select在IO未準備好時, 會當即返回一個標誌位, 經過輪詢標誌來檢查是否有數據準備好, 且在進行IO時, 等待IO結束, 屬於同步IO
任務驅動: 四個nation在IO未準備好時, 會當即返回一個標誌位(非阻塞), 且在IO過程當中, 等待IO結束, 屬於同步IO
異步IO: 在IO未準備好時, 會當即返回一個標誌位(非阻塞); 當IO準備好時, 由OS內核完成IO, 而後通知異步IO的進程對數據進行處理, 而不是在IO過程當中等待IO, 所以屬於異步IO
暫時就理解到這裏, 不徹底對吧... 等有時間再仔細琢磨這些東西
回調機制//http://blog.sina.com.cn/s/blog_77c632410101cjty.htm