美文网首页
Future使用示例

Future使用示例

作者: Muscleape | 来源:发表于2019-07-19 19:21 被阅读0次

开启的线程,处理数据有返回值,需要接收每个线程的返回数据;

1、使用场景介绍

  1. 调用分页查询接口,每次最多返回100条数据,并返回该次查询的总数据条数;
  2. 请求数据量为1000条,单线程情况下需要循环调用10次接口,然后将10次获取到的数据依次存入一个List中;

2、使用需求

  1. 请求一次接口,获取总数据条数,判定需要请求的次数;
  2. 循环开启线程,每个线程只获取指定范围内的数据;
  3. 等待每个线程的返回结果,将每个线程的结果添加到一个List中;
  4. 每次开启的线程,都需要接收其返回数据

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();
            }
        }

相关文章

网友评论

      本文标题:Future使用示例

      本文链接:https://www.haomeiwen.com/subject/iazslctx.html