執行緒池用法的一個例子
阿新 • • 發佈:2018-12-19
寫這個是因為有一個場景會用到,通過角色獲取相應的使用者資訊列表,這裡的使用者是呼叫別人介面獲取的,而介面提供方卻沒有給出通過使用者列表獲取相應的使用者資訊,這裡只好一個一個的取出來,就是說多次呼叫介面獲取使用者資訊。然後就想到了用執行緒池看可不可行,現在給出相應的虛擬碼:
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(); } }
在自己電腦測試一下,相對於一個一個取出來確實是加快了。