@Override
    public Boolean call() throws Exception {
      List<Future<Boolean>> futureList = new ArrayList<>();
      List<Get> getList = new ArrayList<>(Constant.BATCH_GROUP_SIZE);
      int count = 0;
      for (Get get : gets) {
        getList.add(get);
        if (count % Constant.BATCH_GROUP_SIZE == 0) {
          Future<Boolean> f =
              AsyncThreadPoolFactory.ASYNC_HBASE_THREAD_POOL.submit(new GetTask(getList, result));
          futureList.add(f);
          getList = new ArrayList<>(Constant.BATCH_GROUP_SIZE);
        }

        count++;
      }
      Future<Boolean> f =
          AsyncThreadPoolFactory.ASYNC_HBASE_THREAD_POOL.submit(new GetTask(getList, result));
      futureList.add(f);

      boolean isOk = false;
      for (Future<Boolean> future : futureList) {
        try {
          isOk = future.get(500, TimeUnit.MILLISECONDS);
        } catch (TimeoutException ignored) {
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          if (!isOk) {
            future.cancel(Boolean.FALSE);
          }
        }
      }
      return isOk;
    }
  @Override
  public Map<String, Map<String, String>> batch(List<GetItem> getItems) {
    Map<String, Map<String, String>> result = new ConcurrentHashMap<>();

    List<Get> gets = new ArrayList<>(getItems.size());
    for (GetItem getItem : getItems) {
      Get g = new Get(getItem.getRowkey());
      g.addFamily(getItem.getFamily());
      gets.add(g);
    }
    GetGroupTask task = new GetGroupTask(gets, result);
    Future<Boolean> future = AsyncThreadPoolFactory.ASYNC_HBASE_THREAD_POOL.submit(task);
    Boolean r = Boolean.FALSE;
    try {
      r = future.get(500, TimeUnit.MILLISECONDS);
    } catch (TimeoutException ignored) {
    } catch (InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
    if (!r) {
      future.cancel(Boolean.FALSE);
    }
    return result;
  }