Future模式是java多線程開(kāi)發(fā)的一種常用模式,它的核心思想是*異步調(diào)用
Future模式類(lèi)似在網(wǎng)上買(mǎi)東西。比如你在淘寶下單買(mǎi)了一步手機(jī),當(dāng)我們支付完成以后,手機(jī)沒(méi)有辦法立即送到家里,但是在電腦上會(huì)產(chǎn)生一個(gè)訂單。這個(gè)訂單就是將來(lái)發(fā)貨或者領(lǐng)取手機(jī)的重要憑證,這個(gè)憑證也就是Future模式會(huì)給出一個(gè)契約。支付結(jié)束以后,你就可以想干嘛干嘛,這個(gè)訂單就成了商家配貨,發(fā)貨的驅(qū)動(dòng)力。當(dāng)然這一切你都不用擔(dān)心,你要做的就是快遞送貨時(shí),收貨就好了。
對(duì)于Future模式來(lái)說(shuō),雖然它無(wú)法立即給你需要的數(shù)據(jù),但是它會(huì)返回一個(gè)契約,將來(lái)你憑借這個(gè)契約取重新獲取你需要的信息即可。
1.JDK中的Future模式
Future接口類(lèi)似于前文面熟的訂單或者說(shuō)是契約。其中Future接口類(lèi)似于前文描述的契約。通過(guò)它可以得到線程執(zhí)行完之后的數(shù)據(jù)。RunnableFuture繼承了Future和Runnable接口,它有一個(gè)具體的實(shí)現(xiàn)類(lèi)FutureTask類(lèi)。Future類(lèi)有一個(gè)內(nèi)部類(lèi)Sync,一些實(shí)質(zhì)性的工作會(huì)委托Sync類(lèi)實(shí)現(xiàn),而Sync類(lèi)最終會(huì)調(diào)用Callable接口,完成實(shí)際數(shù)據(jù)的組裝工作。
Callable接口只有一個(gè)call方法,它會(huì)返回需要構(gòu)造的數(shù)據(jù)。
一個(gè)簡(jiǎn)單的Future使用實(shí)例。
public class RealData implements Callable<String> {
private String data;
public RealData(String data){
this.data=data;
}
@Override
public String call() throws Exception {
StringBuffer sb=new StringBuffer();
for (int i=0;i<10;i++){
sb.append(data);
Thread.sleep(100);
}
return sb.toString();
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> future = new FutureTask<>(new RealData("h"));
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(future);
System.out.println("請(qǐng)求完畢");
try{
//進(jìn)行其他操作,這里使用sleep模擬其他業(yè)務(wù)操作
Thread.sleep(2000);
}catch (InterruptedException e){
}
//使用future.get得到返回結(jié)果,如果call方法還沒(méi)執(zhí)行完,那么將等待。
System.out.println("數(shù)據(jù):"+future.get());
}
}
除了基本功能外,JDK還為future接口提供了一些簡(jiǎn)單的控制功能。
boolean cancel(boolean mayInterruptIfRunning) ; //取消任務(wù)
boolean iscancelled();//是否已經(jīng)取消
boolead isDone();//是否已經(jīng)完成
V get() ;//取得返回對(duì)象
V get(Long timeout,TimeUnit unit);//取得返回對(duì)象,可以設(shè)置超時(shí)時(shí)常