之前线程池执行的任务是没有返回值的,但这种有返回值的Future任务,可以适应更多的场景。
取消:boolean cancel(boolean mayInterruptIfRunning);
if(!future.isCancelled()){
future.cancel();
}
返回值:V get() throws InterruptedException, ExecutionException;
try {
futureResult = (String) future.get();
} catch (Exception e) {
// 异常处理
}
举个栗子:
1、正常流程,同步执行:
public static void main(String[] args) throws InterruptedException, ExecutionException {
long startTime= System.currentTimeMillis();
System.out.println("主线程任务开始执行");
System.out.println("future 任务执行开始");
Thread.sleep(6000);
System.out.println("future 任务执行结束");
String result = "2019";
// 主线程任务
mainThreadWork();
String futureResult = result;
System.out.println("futureResult:"+futureResult);
System.out.println("主线程任务执行结束");
long endTime= System.currentTimeMillis();
System.out.println("时间消耗:"+ (endTime-startTime));
}
private static void mainThreadWork() throws InterruptedException {
System.out.println("主线程任务--继续执行,状态1");
Thread.sleep(3000);
System.out.println("主线程任务--继续执行,状态2");
}
控制台
主线程任务开始执行
future 任务执行开始
future 任务执行结束
主线程任务--继续执行,状态1
主线程任务--继续执行,状态2
futureResult:2019
主线程任务执行结束
时间消耗:9001
2、Future:
public static void main(String[] args) throws InterruptedException, ExecutionException {
long startTime= System.currentTimeMillis();
System.out.println("主线程任务开始执行");
ExecutorService executorService = Executors.newFixedThreadPool(1);
Future future = executorService.submit(()->{
System.out.println("future 任务执行开始");
Thread.sleep(6000);
// if (1 == 1){
// throw new Exception("111");
// }
System.out.println("future 任务执行结束");
return "2019";
});
mainThreadWork();
// 内部异常已抛出,此处无须catch
String futureResult = (String) future.get();
System.out.println("futureResult:"+futureResult);
executorService.shutdown();
System.out.println("主线程任务执行结束");
long endTime= System.currentTimeMillis();
System.out.println("时间消耗:"+ (endTime-startTime));
}
private static void mainThreadWork() throws InterruptedException {
System.out.println("主线程任务--继续执行,状态1");
Thread.sleep(3000);
System.out.println("主线程任务--继续执行,状态2");
}
控制台打印
主线程任务开始执行
主线程任务--继续执行,状态1
future 任务执行开始
主线程任务--继续执行,状态2
future 任务执行结束
futureResult:2019
主线程任务执行结束
时间消耗:6221
3、CompletableFuture
public static void main(String[] args) throws InterruptedException, ExecutionException {
long startTime= System.currentTimeMillis();
System.out.println("主线程任务开始执行");
Future future = CompletableFuture.supplyAsync(()->{
System.out.println("future 任务执行开始");
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
}
// if (1 == 1){
// throw new RuntimeException("111");
// }
System.out.println("future 任务执行结束");
return "2019";
});
mainThreadWork();
String futureResult = (String) future.get();
System.out.println("futureResult:"+futureResult);
System.out.println("主线程任务执行结束");
long endTime= System.currentTimeMillis();
System.out.println("时间消耗:"+ (endTime-startTime));
}
private static void mainThreadWork() throws InterruptedException {
System.out.println("主线程任务--继续执行,状态1");
Thread.sleep(3000);
System.out.println("主线程任务--继续执行,状态2");
}
控制台
主线程任务开始执行
主线程任务--继续执行,状态1
future 任务执行开始
主线程任务--继续执行,状态2
future 任务执行结束
futureResult:2019
主线程任务执行结束
时间消耗:6177