1、TreadPoolTaskExecutor
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Autowired @Qualifier("commonThreadPool") private ThreadPoolTaskExecutor commonThreadPoolTask;
public void compareZnoCodeFromRedisToDatabase(String cityCode){ String pattern = "ZNO:DEPT:*"; RedisTemplate redisTemplate = null; log.info("begin compareZnoCodeFromRedisToDatabase cityCode:{}",cityCode); Future<String> future = null; List<Future<String>> futureList = new ArrayList<Future<String>>(); Integer perCount = 1000; List<String> keys = Lists.newArrayList(); redisTemplate.execute((RedisConnection connection) -> { try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().count(perCount).match(pattern).build())) { while (cursor.hasNext()){ String key = new String(cursor.next(), StandardCharsets.UTF_8); keys.add(key); if(keys.size()==1000){ while (commonThreadPoolTask.getActiveCount()>=30){ try { Thread.sleep(5000); log.info("thread sleep 1s ...."); } catch (InterruptedException e) { log.error(e.getMessage()); } } futureList.add(synchronizeZnoCode(cityCode,keys)); keys.clear(); } } if(keys.size()>0){ futureList.add(synchronizeZnoCode(cityCode, keys)); } return null; } catch (IOException e) { throw new RuntimeException(e); } }); futureList.forEach(f -> { try { f.get(); } catch (Exception e) { log.error("future compareZnoCodeFromRedisToDatabase error:"+e.getMessage()); } }); log.info("end compareZnoCodeFromRedisToDatabase cityCode:{}",cityCode); } 2、Future public Future synchronizeZnoCode(String cityCode,List<String> keys){ log.info("begin synchronizeZnoCode cityCode:{}",cityCode); return commonThreadPoolTask.submit(new Runnable() { @Override public void run() { } }); }