天天看點

java多線程總結筆記3——Callable和Future

Runnable和Callable

Runnable和Callable<T>都是任務類型。Runnable類隻有一個成員void run(),而Callable<T>類隻有一個成員T call() throws Exception,這兩個函數都應該在子類中被重寫為任務流程。線程在start的時候,會自動調用它們,進而執行這套流程。

可見,Runnable任務的流程函數不能有傳回值,也不準向父函數抛出異常;而Callable任務的流程函數有傳回值,也可以向父函數抛出異常。

利用Callable任務也可以建立程序,但是要先用FutureTask<T>類的構造函數FutureTask<T>(Callable<T> target)把它包裝為FutureTask任務,由于FutureTask<T>類同時繼承了Runnable和Future<T>兩個接口,是以也是Runnable的一種,是以可以用來建立線程。具體做法如下,方括号表示可選項目。

public class MyCallable implements Callable<某種類型>
{
    public 某種類型 call()[ throws 一些異常類型]
    {任務流程}
}

MyCallable myCallable = new MyCallable();
FutureTask<某種類型> futureTask = new FutureTask<某種類型>(myCallable);
Thread myThread = new Thread(futureTask);
myThread.start();
           

Future<T>接口

Future<T>也是任務類型,這種任務可以取消執行,也可以等待其執行完畢然後擷取執行結果,執行結果的類型為T。

boolean cancel(boolean mayInterruptRunning):嘗試取消任務的執行。如果任務尚未啟動,則任務将不會運作;如果任務已經啟動而尚未結束,則mayInterruptRunning決定了是否要嘗試停止任務。如果任務已經完成、已經取消或因為某些其他原因而無法取消,則函數傳回false。

boolean isCancelled():如果任務已被成功取消,則傳回true.

boolean isDone():如果任務已經結束,不管是正常終止、出現異常還是被取消,都會反對true.

T get():等待任務結束,然後傳回任務執行結果。

T get(long timeout, TimeUnit unit):等待任務結束,但是最多等待timeout,然後傳回任務執行結果。

FutureTask<T>類(實作類)

FutureTask<T>類同時繼承了Runnable和Future<T>兩個接口,是以它既有明确的任務流程,又有Future任務可取消、可取得執行結果的特點,執行結果的類型為T。

不僅Callable任務可以包裝成FutureTask任務,Runnable任務也可以。

FutureTask<T>(Callable<T> callable):将callable包裝為FutureTask任務,callable的傳回值就是FutureTask任務成功完成時傳回的執行結果。

FutureTask<T>(Runnable runnable, T result):将runnable包裝為FutureTask任務,result就是FutureTask任務成功完成時傳回的執行結果。

ExecutorService類有關Callable的函數

Future<T> submit(Callable<T> target):向線程池送出target任務,傳回包裝成的FutureTask任務。

Future<T> submit(Runnable target, T result):向線程池送出target任務,任務成功完成時傳回的執行結果為result,傳回包裝成的FutureTask任務。

Future<?> submit(Runnable target):相當于submit(target, null).

List<Future<T>> invokeAll(Collection<Callable<T>> tasks):批量送出任務,當所有任務都完成時,傳回包裝成的FutureTask任務們組成的清單。

List<Future<T>> invokeAll(Collection<Callable<T>> tasks, long timeout, TimeUnit unit):同上。如果到了時限時還有任務沒結束,那就cancel掉所有未結束的任務,然後傳回FutureTask任務清單。

T invokeAny(Collection<Callable<T>> tasks):批量送出任務,一旦有一個任務成功完成,就傳回其執行結果。函數一旦正常或異常傳回,就cancel掉所有未完成的任務。

T invokeAny(Collection<Callable<T>> tasks, long timeout, TimeUnit unit):同上。