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 乙個任務不能被反覆執行,如果想反覆執行,必須重新設定新任務 比...