1. 程式人生 > >java多執行緒之Future模式使用

java多執行緒之Future模式使用

Future模式簡述

  • 傳統單執行緒環境下,呼叫函式是同步的,必須等待程式返回結果後,才可進行其他處理。
    Futrue模式下,呼叫方式改為非同步。
  • Futrue模式的核心在於:充分利用主函式中的等待時間,利用等待時間處理其他任務,充分利用計算機資源。

主要角色

  1. Main:系統啟動,呼叫Client發出請求
  2. Client:返回Data物件,立即返回FutureData,並開啟ClientThread執行緒裝配RealData
  3. Data:返回資料的介面
  4. FutureData:Futrue資料,是一個虛擬的資料,需要裝配RealData
  5. RealData:真實資料,構造比較慢。

JDK內建實現


——-jdk中已經內建future模式的實現。其中最重要的事模組是FutrueTask類,它實現了Runnable介面,作為單獨的執行緒執行,在其run() 方法中,通過Sync內部類,呼叫Callable介面,並維護Callable介面的返回物件。使用FutureTask.get()方法,返回Callable介面的返回物件。
具體使用如下:

RealData.java

package com.y.www;

import java.util.concurrent.Callable;

/**
 * @description:
 * @author: lbYue
 * @date
: Created in 14:11 2018/1/9 */
public class RealData implements Callable<String> { private String para; public RealData(String para){ this.para = para; } @Override public String call() throws Exception { //真實的業務邏輯 StringBuffer sb = new StringBuffer(); for
(int i= 0 ;i < 10 ; i++){ sb.append(para); try { Thread.sleep(100); }catch (InterruptedException e){ } } return sb.toString(); } }

MainTest.java

package com.y.www;

import java.util.concurrent.*;

/**
 * @description:
 * @author: lbYue
 * @date: Created in 14:15 2018/1/9
 */
public class MainTest {

    public static void main(String[] args) throws InterruptedException,ExecutionException{

        FutureTask<String> future = new FutureTask<String>(new RealData("a"));
        ExecutorService executor = Executors.newFixedThreadPool(1);

        executor.submit(future);
        System.out.println("請求完畢!");
        try {
            System.out.println("我在睡覺別打擾我!2秒後迴應");
            Thread.sleep(2000);
        }catch (InterruptedException e){

        }
        System.out.println("資料處理完成:"+future.get());

    }
}

控制檯輸出結果
這裡寫圖片描述