缘起
在项目开发中遇到一种场景,需要给多台(100左右)设备下发指令,一台台下发速度太慢,并发下发的话需要下发结果汇总后在前端展示,这里用CountDownLatch解决问题。
代码
public Object deletePeople(@RequestBody String param){
List<DevicePersonDo> deleteRes = new CopyOnWriteArrayList<>();
try {
DeletePersonDto deletePersonDto = JSONObject.parseObject(param, DeletePersonDto.class);
if(deletePersonDto == null || deletePersonDto.getDeviceSerialNumbers() == null || deletePersonDto.getPersonIds() == null
|| deletePersonDto.getDeviceSerialNumbers().size() == 0 || deletePersonDto.getPersonIds().size() == 0){
return new BaseResult(1000, "参数错误");
}
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(deletePersonDto.getDeviceSerialNumbers().size());
final CountDownLatch countDownLatch = new CountDownLatch(deletePersonDto.getDeviceSerialNumbers().size());
try {
deletePersonDto.getDeviceSerialNumbers().forEach(deviceSerialNumber->{
try {
fixedThreadPool.execute(() -> {
List<PersonDownloadResDto> sucPeople = deletePeopleFromDevice(deviceSerialNumber, deletePersonDto.getPersonIds());
deleteRes.add(new DevicePersonDo(deviceSerialNumber, Configs.getProperty("middlewareId"), sucPeople));
countDownLatch.countDown();
});
}catch (Exception e){
logger.error(e.getMessage());
}
});
countDownLatch.await(60*deletePersonDto.getPersonIds().size(), TimeUnit.SECONDS);
}catch (Exception e){
logger.error(e.getMessage());
e.printStackTrace();
}finally {
fixedThreadPool.shutdown();
}
}catch (Exception e){
logger.error(e.getMessage());
}
return new BaseResult(deleteRes);
}