1. 程式人生 > >多線程的設計模式:Future、Master-Worker

多線程的設計模式:Future、Master-Worker

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