回調--閉包--同步--異步--阻塞--非阻塞

閉包-- 一個可調用的對象, 這個對象包含一些信息, 這些信息來自於建立他的環境, 咱們能夠在將來的某個時刻經過回調機制來得到閉包中的信息, 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

相關文章
相關標籤/搜索