future:一般用于一个主业务中需要调用多个子业务,而且多个子业务之间相互不受影响,所有子业务都完成后统一返回的场景,可大大提高运行速度!
比如:做一份西红柿炒鸡蛋,炒西红柿和炒鸡蛋完全可以同时运行,那么就可以创建两个callable线程,同时去做,当两个都做好之后,混合起来再炒一下就行了。
如果炒西红柿5秒,炒鸡蛋5秒,混合炒5秒,正常流程的话需要15秒,但是用callable线程的话就只需要10秒(西红柿和炒鸡蛋并行处理)省去了5秒的时间!
开火
炒西红柿
炒鸡蛋
混合炒
关火
开火
future1 = callable(炒西红柿)
future2 = callable(炒鸡蛋)
future1.get();
future2.get();
混合炒
关火
package com.ws;
import java.util.concurrent.*;
public class FutureTest {
public static void main(String[] args) {
/*
如果想要获取返回值,我们需要new Callable接口,而且我们要用Executors 线程工具类
*/
long s = System.currentTimeMillis();
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<String> xihongshi = executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(5000);
return "西红柿已经处理完成!";
}
});
Future<String> jidan = executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(5000);
return "鸡蛋已经处理完成!";
}
});
/*
如何拿到future的结果呢?
future.get();
这个get方法是一个阻塞方法,当callable子线程结束之后就能拿到结果
get(times,type) 可以设置最大等待时长,超时则报错
*/
try {
// 同时get() 只有全部执行完才会往下走
String r1 = xihongshi.get();
System.out.println(r1);
String r2 = jidan.get();
System.out.println(r2);
// DO SOME THING
System.out.println("开始混合炒!");
Thread.sleep(5000);
System.out.println("炒完了,累计用时"+(System.currentTimeMillis()-s)/1000+"秒!");
executor.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
--------------------------------------------------------
西红柿已经处理完成!
鸡蛋已经处理完成!
开始混合炒!
炒完了,累计用时10秒!