FutureTask例子(并行计算千万条数据并汇总)

/**
 * FutureTask
 * 将一千万条数据中的数字取出并相加
 */
public class FutureTaskTest {

    static List<String> list = new ArrayList<>(10000000);

    public static void main(String[] args) throws Exception {
        
        //1.生成一千万条数据
        for (int i = 0, j = 10000000; i < j; i++) {
            list.add("AAAA" + 2 + "ssss");
        }
        System.out.println("list set success");

        //2.普通循环测试
        long start = new Date().getTime();
        long resultSum = 0;
        for (int i = 0, j = 10000000; i < j; i++) {
            String s = list.get(i);
            String b = Pattern.compile("[^0-9]").matcher(s).replaceAll("");
            Integer integer = Integer.valueOf(b);
            resultSum += integer;

        }
        long end = new Date().getTime();
        System.out.println((end - start) + "," + resultSum);

        //3.futureTask测试
        long start2 = new Date().getTime();

        FutureTask<Long> futureTask1 = new ChildTask(0, 3333333).getFutureTask();
        FutureTask<Long> futureTask2 = new ChildTask(3333333 + 1, 3333333 * 2).getFutureTask();
        FutureTask<Long> futureTask3 = new ChildTask(3333333 * 2 + 1, 10000000 - 1).getFutureTask();

        Long result = futureTask1.get();//获取结果,此时如果task未结束,会阻塞
        Long result2 = futureTask2.get();
        Long result3 = futureTask3.get();

        long end2 = new Date().getTime();

        System.out.println((end2 - start2) + "," + (result + result2 + result3));


    }

}
//子线程
class ChildTask {

    int start;
    int end;

    public ChildTask(int start, int end) {
        this.start = start;
        this.end = end;
    }

    public FutureTask<Long> getFutureTask() {
        Callable<Long> callable = () -> {
            Long result = 0L;
            for (int i = start, j = end; i <= j; i++) {
                String s = FutureTaskTest.list.get(i);
                String b = Pattern.compile("[^0-9]").matcher(s).replaceAll("");
                Integer num = Integer.valueOf(b);
                result += num;

            }
            return result;
        };
        FutureTask<Long> task = new FutureTask<>(callable);
        new Thread(task).start();
        return task;
    }
}

结果:比普通循环快3s


image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • abandon, desert, forsake, leave, give up abandon :强调永远或完全...
    sunxiaohang阅读 2,567评论 0 3
  • 每每当聆听“船长”“舵手”酒席宴间一番关于公务的聊天时,总有醍醐灌顶感觉,令人匪夷所思“后悔”到:要是我生逢其时...
    崇拜范蠡阅读 140评论 0 0
  • 心里很空。很想找F聊天,却也知道他不会再真正回头了,再聊也无意义。 又一次体会丧失感。
    不爱吃糖的黑色dog阅读 175评论 0 0
  • 今年的雪来的比以往要晚得多,明明已经春天了,雪下的却比冬天的还大。 李白围着围巾站在十字路口,看着天空中飘...
    霡霂霡霂霡霂阅读 1,522评论 1 7
  • jessie181018 并不是水中雨儿吹泡泡 并不是天上雨水在大脑 那是水底精灵的呼吸 在呼唤水面上发呆的你 如...
    微微眠阅读 194评论 0 0