1. 程式人生 > >執行緒池用法的一個例子

執行緒池用法的一個例子

  寫這個是因為有一個場景會用到,通過角色獲取相應的使用者資訊列表,這裡的使用者是呼叫別人介面獲取的,而介面提供方卻沒有給出通過使用者列表獲取相應的使用者資訊,這裡只好一個一個的取出來,就是說多次呼叫介面獲取使用者資訊。然後就想到了用執行緒池看可不可行,現在給出相應的虛擬碼:

volatile HashSet userIdSet = new HashSet();

    /**
     * 通過角色獲取使用者資訊列表
     * @param sysRoleId
     * @return
     * @throws InterruptedException
     */
    public RestResponse<List<User>> getUserListByRoleId(String sysRoleId) throws InterruptedException{
        //通過角色查詢出使用者資訊  由於執行緒,設定final
        final List<UserRoleMid> userRoleMidList = service.getListByRoleId(sysRoleId);
        final List<User> userList = new ArrayList<User>();
        final User user = null;
        ExecutorService executorService = Executors.newCachedThreadPool();
        CountDownLatch countDownLatch = new CountDownLatch(userRoleMidList.size());

        for (int i = 0; i < 20 ; i++) {
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    for (final UserRoleMid userRoleMid: userRoleMidList){
                        if(userRoleMid.getUserId() != null){
                            //查詢使用者
                            boolean flag = false;
                            synchronized (this){
                                flag = userIdSet.add(userRoleMid.getUserId());
                            }
                            if(flag){
                                queryUser(user,userRoleMid,userList,sysRoleId,countDownLatch);
                            }
                        }
                    }
                }
            });
        }
        //阻塞 直到超時或者countdown userrolelist.count 次後
        countDownLatch.await(30, TimeUnit.SECONDS);
        return ...;

    }

    /**
     * 用於獲取使用者資訊
     * @param user
     * @param record
     * @param userList
     * @param sysRoleId
     * @param countDownLatch
     */
    public void queryUser(User user, UserRoleMid userRoleMid,List<User> userList,String sysRoleId,CountDownLatch countDownLatch){
        try{
            //使用者使用者資訊
            user = RemoteUser.getUserByRemote(userRoleMid.getUserId());
            userList.add(user);
            countDownLatch.countDown();
        }catch{
            countDownLatch.countDown();
        }

    }

在自己電腦測試一下,相對於一個一個取出來確實是加快了。