問題
如何給ExecutorService
分配任務(wù)
答案
給ExecutorService分配任務(wù)
ExecuteService
可以執(zhí)行Runnable
任務(wù),也可以執(zhí)行Callable
任務(wù).ExecutorService
有很多方法可以執(zhí)行任務(wù),包括execute()
(從Executor
接口繼承),還有submit()
,invokeAny()
,invokeAll()
.
public static void main(String[] args) throws ExecutionException, InterruptedException {
Runnable runnableTask = () -> {
System.out.println("run task");
};
Callable<String> callableTask = () -> {
System.out.println("callable task");
return "callable task return value";
};
List<Callable<String>> callableTasks = new ArrayList<>();
callableTasks.add(callableTask);
callableTasks.add(callableTask);
callableTasks.add(callableTask);
ExecutorService executorService = Executors.newFixedThreadPool(10);
//execute()方法
executorService.execute(runnableTask);
//submit()方法
Future<String> future = executorService.submit(callableTask);
System.out.println("submit result:" + future.get());
//invokeAny()方法
String invokeAnyResult = null;
try {
invokeAnyResult = executorService.invokeAny(callableTasks);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("invokeAny result:" + invokeAnyResult);
//invokeAll()方法
List<Future<String>> invokeAllResultList = Arrays.asList();
try {
invokeAllResultList = executorService.invokeAll(callableTasks);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < invokeAllResultList.size(); i++) {
System.out.println("invokeAllResult" + " " + i + ":" + invokeAllResultList.get(i).get());
}
}
}
-
execute方法沒有返回值,只能執(zhí)行
Runnable
任務(wù),它無法獲取任務(wù)的執(zhí)行結(jié)果和獲取任務(wù)的執(zhí)行狀態(tài).
executorService.execute(runnableTask);
-
submit方法可以提交一個(gè)
Runnable
任務(wù)或者一個(gè)Callable
任務(wù),返回一個(gè)Future
類型的結(jié)果,可以通過調(diào)用Future.get()
方法獲取返回值.
Future<String> future = executorService.submit(callableTask);
System.out.println("submit result:" + future.get());
-
invokeAny方法提交一個(gè)
Callable
任務(wù)集合,每個(gè)任務(wù)都會(huì)被執(zhí)行,返回其中一個(gè)執(zhí)行成功的任務(wù)的返回值(如果有一個(gè)任務(wù)成功被執(zhí)行).
String invokeAnyResult = null;
try {
invokeAnyResult = executorService.invokeAny(callableTasks);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("invokeAny result:" + invokeAnyResult);
-
invokeAll方法提交一個(gè)
Callable
任務(wù)集合,每個(gè)任務(wù)都會(huì)被執(zhí)行,返回一個(gè)Future
列表,遍歷Future
可以獲取每個(gè)方法的返回值.
List<Future<String>> invokeAllResultList = Arrays.asList();
try {
invokeAllResultList = executorService.invokeAll(callableTasks);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < invokeAllResultList.size(); i++) {
System.out.println("invokeAllResult" + " " + i + ":" + invokeAllResultList.get(i).get());
}