Future模式
阿新 • • 發佈:2017-05-12
main exceptio spa submit 執行 exec interrupt package .get
Future模式核心思想是異步調用。我們可以先拿到調用的憑證,讓方法先返回,讓他在後臺慢慢的處理這個請求。通過這個可以實現異步操作。
JDK經準備好了一套完美的實現方式。我們用於執行的異步線程需要繼承Callable接口,相當於Runnable,Callable接口中有一個方法call(),相當於run(),在裏面寫自己的業務。把這個線程放在futureTask中,這個相當於憑證。把futureTask交給線程池來進行異步處理,我們可以通過futureTask中的get()方法返回結果,結果沒有返回會阻塞。
具體實現:
package jdkFuture; import java.util.concurrent.Callable;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){ e.printStackTrace(); } } return sb.toString(); } }
package jdkFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; public class FutureMain { public static void main(String[] args) { FutureTask<String> future = new FutureTask<String>(new ReaLData("a")); ExecutorService executor = Executors.newFixedThreadPool(1); executor.submit(future); System.out.println("請求完畢"); while(true){ try { System.out.println("數據= " + future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } } }
Future模式