首页 > Java > 使用CompletableFuture实现滴滴打车

使用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,部分方法可能需要调整

分类: Java 标签: ,
本文的评论功能被关闭了.