Future+Callable异步查询
-
Future (java.util.concurrent)
表示异步计算的结果。提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。 -
Callable (java.util.concurrent)
Callable类似于Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。两者的区别是:Runnable不会反会返回结果,无法抛出经过检查的异常;Callable可以有返回值,返回值可以被Future拿到,能够抛出经过检查的异常。/** * 异步回调: * Future * Callable<T> */ public class AsynchronousCallback { public static void main(String[] args) { String[] addresss = {"北京市","上海市"}; List<Future<List<UserEntity>>> futureList = new ArrayList<>(); for (String address: addresss) { futureList.add(ThreadPoolExecutorFactory.executor.submit(new TaskCallable(address))); } List<UserEntity> users = new ArrayList<>(); for (Future<List<UserEntity>> user: futureList) { try { //获取future中的返回值 List<UserEntity> list = user.get(); if (!CollectionUtils.isEmpty(list)){ users.addAll(list); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } System.out.println(users); } }
-
实现Callable, call方法中调用查询数据接口
class TaskCallable implements Callable<List<UserEntity>> { private String address; public TaskCallable(String address) { this.address = address; } @Override public List<UserEntity> call() throws InterruptedException { System.out.println(address); UserServiceImpl userService = new UserServiceImpl(); List<UserEntity> userServiceById = userService.findById(address); return userServiceById; } }
-
返回结果
北京市 上海市 [UserEntity{id=1, username='小红', sex='女', age=18, address='北京市'}, UserEntity{id=2, username='小刚', sex='男', age=18, address='北京市'}, UserEntity{id=3, username='小青', sex='女', age=18, address='北京市'}, UserEntity{id=4, username='小率', sex='男', age=18, address='北京市'}, UserEntity{id=4, username='小率', sex='男', age=18, address='北京市'}, UserEntity{id=6, username='小1', sex='女', age=18, address='上海市'}, UserEntity{id=7, username='小2', sex='男', age=18, address='上海市'}, UserEntity{id=8, username='小3', sex='女', age=18, address='上海市'}, UserEntity{id=9, username='小4', sex='男', age=18, address='上海市'}, UserEntity{id=10, username='小5', sex='男', age=18, address='上海市'}]