多線程的設計模式:Future、Master-Worker
阿新 • • 發佈:2018-07-30
future模式 多線程 try 繼續 分享 接收 imp 線程結構 優化
一 簡介
並行設計模式屬於設計優化的一部分,它是對一些常用的多線程結構的總結和抽象。與串行程序相比,並行程序的結構通常更為復雜,因此合理的使用並行模式在多線程開發中更具有意義,在這裏主要介紹==Future==、==Master-Worker==和==生產者-消費者==模型
二 Future模式
Future模式有點類似於商品訂單。比如在網購時,當看中某一件商品時,就可以提交訂單,當訂單處理完成後,在家等待商品送貨上門即可。或者說更形象的,我們發送Ajax請求的時候,頁面是異步的進行後臺處理,用戶無需一直等待請求的結果,可以繼續瀏覽或操作其他內容。
public class Main { public static void main(String[] args) { FutureClient futureClient = new FutureClient(); Date date = futureClient.request("date"); System.out.println("請求已經被處理..."); System.out.println("去做其他操作..."); System.out.println("結果為:" + date.getRequest()); } } public class FutureClient { public Date request(final String queryStr) { //1.想要一個代理對象(Date接口的實現類)先返回給發送請求的客戶端,告訴她請求已經被接收到,可以做其他事情 final FutureDate futureDate = new FutureDate(); //2.啟動一個新的線程,去加載真實數據,傳遞給這個代理對象 new Thread(new Runnable() { @Override public void run() { //3.這個新的線程可以去加載真實對象,然後傳遞給代理對象 RealDate realDate = new RealDate(queryStr); futureDate.setRealDate(realDate); } }).start();; return futureDate; } } public interface Date { String getRequest(); } public class FutureDate implements Date{ private RealDate realDate; private Boolean isReady = false; @Override public synchronized String getRequest() { while (!isReady) { try { //如果沒有裝載完畢,程序一直處於阻塞狀態 wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //裝載好直接獲取數據 return this.realDate.getRequest(); } public synchronized void setRealDate(RealDate realDate) { while (isReady) { //如果已經加載完畢,就直接返回 return; } //如果沒有,就進行裝載真實對象 this.realDate = realDate; this.isReady = true; //通知 notify(); } } public class RealDate implements Date{ private String realDate; public RealDate(String realDate) { System.out.println("根據" + realDate + "進行查詢,這是一個很耗時的操作..."); try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("操作完畢,獲取結果..."); this.realDate = "查詢結果"; } @Override public String getRequest() { // TODO Auto-generated method stub return this.realDate; } }
運行結果:
請求已經被處理...
去做其他操作...
根據date進行查詢,這是一個很耗時的操作...
操作完畢,獲取結果...
結果為:查詢結果
三 Master-Worker模式
多線程的設計模式:Future、Master-Worker