使用CompletableFuture实现滴滴打车
2024年4月6日
需求背景
打车回家,同时叫多辆网约车,相应最快的网约车可以抢到订单,其他网约车抢单是失败。
数据准备
数据类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car {
/**
* 网约车名字
*/
private String name;
/**
* 网约车相应时间
*/
private Integer responseTime;
}
模拟数据
public class CarData {
/**
* 模拟一些网约车的数据
* @return 网约车列表
*/
public static List<Car> getCarsInfo() {
List<Car> list = new ArrayList<>();
Car car1 = new Car("BMW", 7);
Car car2 = new Car("BENS", 3);
Car car3 = new Car("BYD", 5);
Car car4 = new Car("Tesla", 1);
list.add(car1);
list.add(car2);
list.add(car3);
list.add(car4);
return list;
}
}
打车服务
public class CallService {
public Car callCar(Car car) {
Integer responseTime = car.getResponseTime();
System.out.println(Thread.currentThread().getName() + "--begin--" +car.getName());
try {
TimeUnit.SECONDS.sleep(responseTime);
} catch (Exception e){
System.out.println(e);
}
System.out.println(Thread.currentThread().getName() + "--end--" +car.getName());
return car;
}
}
测试打车服务
public class CFDemo03 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
List<Car> list = CarData.getCarsInfo();
CallService cs = new CallService();
List<CompletableFuture<Car>> list1 = list.stream().map(car -> CompletableFuture.supplyAsync(() -> cs.callCar(car))).toList();
CompletableFuture<Object> anyOf = CompletableFuture.anyOf(list1.toArray(new CompletableFuture[list.size()]));
System.out.println(anyOf.get());
}
}
返回响应最快的车辆后,打车服务结束。
备注:
使用的版本是java21, 如果你使用java8,部分方法可能需要调整