多執行緒開發可以更好的發揮多核cpu效能,常用的多執行緒設計模式有:future、master-worker、guard susperionsion、不變、生產者-消費者 模式;jdk除了定義了若干併發的資料結構,也內建了多執行緒框架和各種執行緒池; 鎖(分為內部鎖、重入鎖、讀寫鎖)、threadlocal、訊號量等在併發控制中發揮著巨大的作用。這裡重點介紹第一種併發——future模型。
一、什麼是future模型:
該模型是將非同步請求和**模式聯合的模型產物。類似商品訂單模型。見下圖:
客戶端傳送乙個長時間的請求,服務端不需等待該資料處理完成便立即返回乙個偽造的**資料(相當於商品訂單,不是商品本身),使用者也無需等待,先去執行其他的若干操作後,再去呼叫伺服器已經完成組裝的真實資料。該模型充分利用了等待的時間片段。
二、future模式的核心結構:
main:啟動系統,呼叫client發出請求;
client:返回data物件,理解返回futuredata,並開啟clientthread執行緒裝配realdata;
data:返回資料的介面;
futuredata:future資料,構造很快,但是是乙個虛擬的資料,需要裝配realdata;
realdata:真實資料,構造比較慢。
三、future模式的**實現:
(1)main函式:
package tgb;
public class main catch (exception e)
//真實資料
system.out.println("資料 = "+ data.getresult());} }
(2)client的實現:
package tgb;
public class client
}.start();
return future; }}
(3)data的實現:
package tgb;
public inte***ce data
(4)futuredata:
package tgb;
/** * 是對realdata的乙個包裝
* @author limin
* */
public class futuredata implements data
this.realdata=realdata;
isready=true;
notifyall();
}@override
public synchronized string getresult() catch (exception e)
} return realdata.result; }}
(5)realdata實現:
package tgb;
public class realdata implements data catch(exception e)
result= sb.tostring();
} }
@override
public string getresult()
}
注意:futuredata是對realdata的包裝,是dui真實資料的乙個**,封裝了獲取真實資料的等待過程。它們都實現了共同的介面,所以,針對客戶端程式組是沒有區別的;
客戶端在呼叫的方法中,單獨啟用乙個執行緒來完成真實資料的組織,這對呼叫客戶端的main函式式封閉的;
因為咋futuredata中的notifyall和wait函式,主程式會等待組裝完成後再會繼續主程序,也就是如果沒有組裝完成,main函式會一直等待。
高併發程式設計Future模式
future模式是多執行緒開發中非常常見的一種設計模式,它的核心思想是非同步呼叫。當我們需要呼叫乙個方法時,若該方法比較複雜,執行較慢,那麼我們就要一直等待直到該方法執行結束,返回資訊。但我們有時候並不急著要這個結果,而希望在這個方法在執行的時候可以做別的事情,而當我們需要這個結果的時候,再去獲取這...
Future模式(憑據模式)
此種方式將future與task分離開來。導致finish 方法暴露出來。被外部呼叫。更優的方式將future與task結合起來。參考jdk futuretask類 不便於管理。如果要實現cancle,參考futuretask在內部將callback與future分離開來的設計 public int...
手寫Future模式
根據前面我所說的futrue模式,手寫乙個 公共data資料介面 public abstract class data package futuretest 獲取真實資料 public class realdata extends data catch interruptedexception e ...