execute方法
submit方法
提交任务task,用返回值Future获得任务执行结果。
Future 用于主线程接受线程池中线程的返回结果。
ExecutorService executorService = Executors.newFixedThreadPool(2);
//提交第一个任务返回结果
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
log.debug("running");
TimeUnit.SECONDS.sleep(1);
return "ok";
}
});
//提交第二个任务返回结果
Future<String> future2 = executorService.submit(() -> {
log.debug("running");
TimeUnit.SECONDS.sleep(1);
return "success";
});
try {
String res = future.get();
String res2 = future2.get();
log.debug("res={}", res);
log.debug("res2={}", res2);
} catch (Exception e) {
e.printStackTrace();
}
invokeAll方法
提交一个任务集合,返回任务集合的所有执行结果。
带超时时间的invokeAll方法,如果规定的时间没有线程池中的任务没有执行完,会把后续的取消掉
ExecutorService executorService = Executors.newFixedThreadPool(3);
List<Callable<String>> callableList = Arrays.asList(
() -> {
log.debug("第一个任务");
TimeUnit.SECONDS.sleep(1);
return "first blood";
},
() -> {
log.debug("第二个任务");
TimeUnit.SECONDS.sleep(2);
return "second blood";
},
() -> {
log.debug("第三个任务");
TimeUnit.SECONDS.sleep(3);
return "third blood";
}
);
try {
List<Future<String>> futures = executorService.invokeAll(callableList);
futures.forEach(f -> {
try {
String s = f.get();
log.debug("s={}", s);
} catch (Exception e1) {
e1.printStackTrace();
}
});
} catch (Exception e) {
e.printStackTrace();
}
invokeAny方法
任务集合中只要有一个任务执行完就返回结果,并取消其它任务。
带超时的invokeAny方法
ExecutorService executorService = Executors.newFixedThreadPool(3);
List<Callable<String>> callableList = Arrays.asList(
() -> {
log.debug("第一个任务");
TimeUnit.SECONDS.sleep(1);
return "first blood";
},
() -> {
log.debug("第二个任务");
TimeUnit.SECONDS.sleep(2);
return "second blood";
},
() -> {
log.debug("第三个任务");
TimeUnit.SECONDS.sleep(3);
return "third blood";
}
);
try {
String future = executorService.invokeAny(callableList);
log.debug("s={}", future);
} catch (Exception e) {
e.printStackTrace();
}