Future+Callable異步查詢

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='上海市'}]
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章