中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

Java多(duo)線程:Callable,Future,FutureTask

一(yi)、Future

Future和(he)Callable基本是成對出現的,Callable負責產生結(jie)果(guo),Future負責獲取(qu)結(jie)果(guo)。
    1、Callable接口(kou)類(lei)似于Runnable,只是Runnable沒有(you)返回值。
    2、Callable任務(wu)除了返(fan)(fan)回正常結(jie)果(guo)之外,如果(guo)發生異(yi)(yi)常,該異(yi)(yi)常也會(hui)被返(fan)(fan)回,即Future可以拿(na)到異(yi)(yi)步(bu)執行任務(wu)各種結(jie)果(guo);
    3、Future.get方法會(hui)導致主線(xian)程阻塞,直到Callable任務執行完(wan)成;
Future就(jiu)是(shi)對于具體的Runnable或者Callable任務的執行結(jie)果(guo)進行取(qu)消、查詢是(shi)否完成(cheng)、獲取(qu)結(jie)果(guo)。必要時可以通(tong)過(guo)get方法獲取(qu)執行結(jie)果(guo),該方法會阻塞直到(dao)任務返(fan)回結(jie)果(guo)。
  
Future類是一(yi)個接(jie)口:
   在(zai)Future接口中聲(sheng)明(ming)了5個方(fang)(fang)法,下面(mian)依(yi)次解釋每個方(fang)(fang)法的作(zuo)用:
  • cancel方(fang)法用來取(qu)消(xiao)任(ren)(ren)(ren)務(wu)(wu),如(ru)果(guo)取(qu)消(xiao)任(ren)(ren)(ren)務(wu)(wu)成(cheng)(cheng)功則(ze)(ze)返回(hui)(hui)(hui)true,如(ru)果(guo)取(qu)消(xiao)任(ren)(ren)(ren)務(wu)(wu)失敗則(ze)(ze)返回(hui)(hui)(hui)false。參(can)數mayInterruptIfRunning表(biao)示(shi)是(shi)否允許(xu)取(qu)消(xiao)正(zheng)在(zai)執(zhi)(zhi)行(xing)卻沒有執(zhi)(zhi)行(xing)完(wan)畢(bi)的任(ren)(ren)(ren)務(wu)(wu),如(ru)果(guo)設置true,則(ze)(ze)表(biao)示(shi)可(ke)以取(qu)消(xiao)正(zheng)在(zai)執(zhi)(zhi)行(xing)過程(cheng)中的任(ren)(ren)(ren)務(wu)(wu)。如(ru)果(guo)任(ren)(ren)(ren)務(wu)(wu)已(yi)經(jing)完(wan)成(cheng)(cheng),則(ze)(ze)無(wu)論mayInterruptIfRunning為true還是(shi)false,此(ci)方(fang)法肯(ken)定返回(hui)(hui)(hui)false,即如(ru)果(guo)取(qu)消(xiao)已(yi)經(jing)完(wan)成(cheng)(cheng)的任(ren)(ren)(ren)務(wu)(wu)會返回(hui)(hui)(hui)false;如(ru)果(guo)任(ren)(ren)(ren)務(wu)(wu)正(zheng)在(zai)執(zhi)(zhi)行(xing),若mayInterruptIfRunning設置為true,則(ze)(ze)返回(hui)(hui)(hui)true,若mayInterruptIfRunning設置為false,則(ze)(ze)返回(hui)(hui)(hui)false;如(ru)果(guo)任(ren)(ren)(ren)務(wu)(wu)還沒有執(zhi)(zhi)行(xing),則(ze)(ze)無(wu)論mayInterruptIfRunning為true還是(shi)false,肯(ken)定返回(hui)(hui)(hui)true。
  • isCancelled方法表(biao)示任務是(shi)否被取(qu)消成功,如果在任務正常完成前(qian)被取(qu)消成功,則返回 true。
  • isDone方法表示任(ren)務是否已經完(wan)成,若任(ren)務完(wan)成,則返回true;
  • get()方法用來獲取執(zhi)(zhi)行結果,這個方法會產生阻塞,會一直等到任務執(zhi)(zhi)行完畢才(cai)返回執(zhi)(zhi)行結果;
  • get(long timeout, TimeUnit unit)用(yong)來獲取(qu)執(zhi)行結果(guo),如果(guo)在指定(ding)時間(jian)內(nei),還沒(mei)獲取(qu)到結果(guo),就直接拋TimeoutException。
  

也就是(shi)說Future提供了(le)三(san)種功能(neng):

  •   1)判斷(duan)任(ren)務是否完成;
  •   2)能夠中(zhong)斷任務;
  •   3)能夠獲取(qu)任務(wu)執行結(jie)果。
  因為(wei)Future是一個接(jie)口,所(suo)以是無(wu)法直接(jie)用來創(chuang)建對象使用的,FutureTask是一個具體(ti)實(shi)現(xian)類。

二、.FutureTask

  RunnableFuture繼承了Runnable接(jie)口和Future接(jie)口,而FutureTask實現(xian)了RunnableFuture接(jie)口。所(suo)以它既可以作(zuo)(zuo)為Runnable被(bei)線程執行,又可以作(zuo)(zuo)為Future得到(dao)Callable的返回(hui)值(zhi)。
  FutureTask是Future接口的一個實現類。
所(suo)以(yi)可通過Excutor(線(xian)(xian)程池) 來(lai)執(zhi)行,也可傳遞給Thread對象執(zhi)行。 Executor框(kuang)架利(li)用FutureTask來(lai)完(wan)(wan)成異步任務,并(bing)可以(yi)用來(lai)進行任何潛(qian)在的(de)耗時的(de)計(ji)算。一般FutureTask多用于耗時的(de)計(ji)算,主(zhu)線(xian)(xian)程可以(yi)在完(wan)(wan)成自己的(de)任務后,再去獲取結果。
 

三(san)、實際(ji)案例

 例如現在通過調用一個方法從遠程獲取一些計算結果,如果是最傳統的同步方式,代碼大概如下:
  HashMap data = getDataFromRemote();
 我們將一直等待getDataFromRemote()的返回,然后才能繼續后面的工作。這個函數是從遠程獲取數據的計算結果的,如果需要的時間很長,并且后面的那部分代碼與這些數據沒有有關系的話,阻塞在這里等待結果就會比較浪費時間。那么我們有什么辦法改進呢?
 能夠想到的辦法就是調用函數后馬上返回,然后繼續向下執行,等需要用數據時再來用,或者說再來等待這個數據。具體實現起來有兩種方式,一種是使用Future,一種是用回調
 
使用Future
Future<HashMap> future = getDataFromRemote2();
//do something
HashMap data = (HashMap) future.get();

 

getDataFromRemote2()啟動了對遠程計算結果的獲取,同時自己的線程還在繼續處理,知道需要時再獲取數據
private Future<HashMap> getDataFromRemote2() {
    return threadpool.submit(new Callable<HashMap>() {
        public HashMap call() throws Exception {
            return getDataFromRemote()
        }
    });
}

 

 
 
posted @ 2014-09-11 14:55  ^_TONY_^  閱讀(2926)  評論(1)    收藏  舉報