public <T> List<T> findParallel0(final TableName tableName, final List<Scan> scans, final ResultsExtractor<T> action) {
        final Scan[] copy = scans.toArray(new Scan[0]);

        final ScanMetricReporter.Reporter reporter = scanMetric.newReporter(tableName, "block-multi", copy);
        final Collection<ScanMetrics> scanMetricsList = new ArrayBlockingQueue<>(copy.length);

        List<Callable<T>> callables = callable(tableName, action, copy, scanMetricsList);

        List<T> results = new ArrayList<>(copy.length);
        List<List<Callable<T>>> callablePartitions = ListUtils.partition(callables, this.maxThreadsPerParallelScan);
        for (List<Callable<T>> callablePartition : callablePartitions) {
            try {
                List<Future<T>> futures = this.executor.invokeAll(callablePartition);
                for (Future<T> future : futures) {
                    results.add(future.get());
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                logger.warn("interrupted while findParallel [{}].", tableName);
                return Collections.emptyList();
            } catch (ExecutionException e) {
                logger.warn("findParallel [{}], error : {}", tableName, e);
                return Collections.emptyList();
            }
        }
        reporter.report(scanMetricsList);
        return results;
    }
@author emeroad
@author HyunGil Jeong
@author minwoo.jung
@author Taejin Koo
commons-hbase/src/main/java/com/navercorp/pinpoint/common/hbase/HbaseTemplate.java