Callable介面解析

2021-07-12 07:42:23 字數 2505 閱讀 2118

public

inte***ce callable

先看下runnable介面的定義

public

inte***ce runnable

callable的call()方法類似於runnable介面中run()方法,都定義任務要完成的工作,實現這兩個介面時要分別重寫這兩個方法,主要的不同之處是call()方法是有返回值的(其實還有一些區別,例如call方法可以丟擲異常,run方法不可以),執行callable任務可以拿到乙個future物件,表示非同步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。通過future物件可以了解任務執**況,可取消任務的執行,還可獲取執行結果。

我們先定義乙個callable任務mycallabletask:

class

mycallabletask

implements

callable

}

①借助futuretask執行

futuretask類同時實現了兩個介面,future和runnable介面,所以它既可以作為runnable被執行緒執行,又可以作為future得到callable的返回值。

借助futuretask執行的大體流程是:

callable<

integer

> mycallabletask =

new mycallabletask();

futuretask<

integer

> futuretask=

new futuretask<

integer

>(mycallabletask);

newthread(futuretask).start();

通過futuretask可以得到mycallabletask的call()的執行結果:

futuretask.get();

②借助執行緒池來執行

執行緒池中執行callable任務的原型例如:

public

inte***ce

executorservice

extends

executor

借助執行緒池來執行callable任務的一般流程為:

executorservice exec = executors.newcachedthreadpool();

future

future = exec.submit(new mycallabletask());

通過future可以得到mycallabletask的call()的執行結果:

future.get();

在網上看到了幾個比較好的**例子:

a.callable任務借助futuretask執行:

public

class callableandfuturetask

};futuretaskfuture = new futuretask(callable);

new thread(future).start();

try catch (interruptedexception e) catch (executionexception e)

}}

b.callable任務和執行緒池一起使用,然後返回值是future:

public

class callableandfuture

});try catch (interruptedexception e) catch (executionexception e)

}}

以上a,b例子摘自(

c.當執行多個callable任務,有多個返回值時,我們可以建立乙個future的集合,例如:

class mycallabletask implements callable  

@override

public string call() throws exception

return

"result of callable: "+id;

}

}public

class test

for (futurefs : results) catch (exception e)

} else

}

exec.shutdown();

} }

那麼引入callable介面具有哪些好處呢?

①可以獲得任務執行返回值;

②通過與future的結合,可以實現利用future來跟蹤非同步計算的結果。

理解Callable介面

callable介面是另一種獲得執行緒的方法,在這之前,所知道的獲得執行緒的方法是 繼承thread類,實現runnable介面。在這裡需要知道runnable介面和callable介面的區別 callable有返回值,runnable沒有返回值 callable拋異常,runnable不拋異常 落...

Callable和future介面詳解

runnbale封裝乙個非同步執行的任務,可以把它想象成乙個沒有任何引數和返回值的非同步方法。callable和runnable相似,但是它有返回值。callable介面是引數化的型別,只有乙個方法call public inte ce callable catch runtimeexception...

Juc入門之Callable介面

furure介面實現執行緒直接資料的互動 runnable介面不可以,因為runnable介面的run方法返回值是void callable實現的未來任務 1 未來任務的get 方法會阻塞主線程的執行 主線程需要得到未來任務的返回值 2 乙個任務不能被反覆執行,如果想反覆執行,必須重新設定新任務 比...