问题:如何给ExecutorService分配任务
2019-01-22 本文已影响6人
Dream_Lin
问题
如何给ExecutorService
分配任务
答案
给ExecutorService分配任务
ExecuteService
可以执行Runnable
任务,也可以执行Callable
任务.ExecutorService
有很多方法可以执行任务,包括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方法没有返回值,只能执行
Runnable
任务,它无法获取任务的执行结果和获取任务的执行状态.
executorService.execute(runnableTask);
-
submit方法可以提交一个
Runnable
任务或者一个Callable
任务,返回一个Future
类型的结果,可以通过调用Future.get()
方法获取返回值.
Future<String> future = executorService.submit(callableTask);
System.out.println("submit result:" + future.get());
-
invokeAny方法提交一个
Callable
任务集合,每个任务都会被执行,返回其中一个执行成功的任务的返回值(如果有一个任务成功被执行).
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方法提交一个
Callable
任务集合,每个任务都会被执行,返回一个Future
列表,遍历Future
可以获取每个方法的返回值.
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());
}