問題
Future
接口是什么
答案
Future接口
ExecutorService
接口的submit()
方法和invokeAll()
方法返回一個(gè)Future
對(duì)象或者Future
對(duì)象的集合,從Future
中可以獲取到任務(wù)執(zhí)行的結(jié)果或者獲取到任務(wù)執(zhí)行的狀態(tài)(任務(wù)是運(yùn)行中還是執(zhí)行完成).
Future
接口提供了一個(gè)可能阻塞的get()
方法,返回Callable
任務(wù)的返回值,如果是Runnable
任務(wù),將返回null.當(dāng)任務(wù)還沒有返回結(jié)果之前,調(diào)用get()
方法將會(huì)導(dǎo)致方法被阻塞,直到任務(wù)返回結(jié)果.
Future<String> future = executorService.submit(callableTask);
String result = null;
try {
result = future.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
get()
方法的長(zhǎng)時(shí)間阻塞會(huì)導(dǎo)致一個(gè)應(yīng)用的性能下降,如果任務(wù)的返回值并不重要,可以通過調(diào)用帶timeout的方法來(lái)避免這種問題.
String result = future.get(200, TimeUnit.MILLISECONDS);
如果執(zhí)行的時(shí)間比指定的時(shí)間來(lái)的長(zhǎng),將會(huì)拋出一個(gè)TimeoutException
異常,但任務(wù)還會(huì)繼續(xù)執(zhí)行,只是取消獲取任務(wù)返回值的獲取.
使用isDone()
方法可以檢查任務(wù)是否已經(jīng)執(zhí)行完成.
使用cancel()
方法可以取消任務(wù)的執(zhí)行(可能在執(zhí)行途中被取消).使用isCancelled()
方法可以檢查任務(wù)是否被取消.
boolean canceled = future.cancel(true);
boolean isCancelled = future.isCancelled();