开启的线程,处理数据有返回值,需要接收每个线程的返回数据;
1、使用场景介绍
- 调用分页查询接口,每次最多返回100条数据,并返回该次查询的总数据条数;
- 请求数据量为1000条,单线程情况下需要循环调用10次接口,然后将10次获取到的数据依次存入一个List中;
2、使用需求
- 请求一次接口,获取总数据条数,判定需要请求的次数;
- 循环开启线程,每个线程只获取指定范围内的数据;
- 等待每个线程的返回结果,将每个线程的结果添加到一个List中;
- 每次开启的线程,都需要接收其返回数据;
3、代码
阿里的 Java开发手册,上面有线程池的一个建议:线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险;
// 开启线程-方法1
private ExecutorService executorService = new ThreadPoolExecutor(2, 3, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
// 开启线程-方法2
// ExecutorService executorService = Executors.newCachedThreadPool();
// 开启线程-方法3
// ExecutorService executorService = Executors.newSingleThreadExecutor();
// count:需要循环的次数
// 查询数据方法:List<Object> dateCellList = queryDate(Object params);
List<Object> dataAllList = new LinkedList();
List<Future> futureList = Collections.synchronizedList(new LinkedList<>());
int count = 10;
for (int i = 1; i <= count; i++) {
final Future<List<Object>> futureCell = executorService.submit(() -> {
List<Object> dateCellList = queryDate(Object params);
return dateCellList;
});
futureList.add(futureCell);
}
for (Future future : futureList) {
try {
List<Object> dateCellList = (List<Object>) future.get(30, TimeUnit.SECONDS);
dataAllList.add(dateCellList);
dateCellList.clear();
} catch (InterruptedException | ExecutionException | TimeoutException e) {
e.printStackTrace();
}
}
网友评论