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='上海市'}]