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

2019-05-09  本文已影响0人  TheUnforgiven
/**
 * 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
上一篇下一篇

猜你喜欢

热点阅读