【Java 并发编程】ForkJoin 框架使用代码实例

2020-06-04 15:04:56 浏览数 (1)

在文章

JUC并行计算框架 Fork/Join 原理图文详解&代码示例

中,我们详细介绍了 ForkJoin 框架 的原理,这里我们再给出一个代码实例:

代码语言:javascript复制
package i.juc;

import java.util.Arrays;
import java.util.List;

/**
 * @author: Jack
 * 2020-06-03 10:20
 */
public class ForkJoinTest {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9");

        ForkJoinTaskDemo demo = new ForkJoinTaskDemo(list);
        List<ReportLine> result = demo.compute();

        System.out.println(result);

    }
}
代码语言:javascript复制
package i.juc;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.RecursiveTask;
import java.util.stream.Collectors;

/**
 * @author: Jack
 * 2020-06-03 10:16
 */
public class ForkJoinTaskDemo extends RecursiveTask<List<ReportLine>> {

    List<String> workNoList;

    public ForkJoinTaskDemo(List<String> workNoList) {
        this.workNoList = workNoList;
    }

    @Override
    protected List<ReportLine> compute() {
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        if (workNoList.size() > 0 && workNoList.size() <= 3) {
            return workNoList.stream().map(ReportLine::new).collect(Collectors.toList());
        }

        List<String> list1 = workNoList.subList(0, 3);
        List<String> list2 = workNoList.subList(3, 6);
        List<String> list3 = workNoList.subList(6, 9);

        ForkJoinTaskDemo t1 = new ForkJoinTaskDemo(list1);
        ForkJoinTaskDemo t2 = new ForkJoinTaskDemo(list2);
        ForkJoinTaskDemo t3 = new ForkJoinTaskDemo(list3);

        invokeAll(t1, t2, t3);

        List<ReportLine> result = new ArrayList<>();

        List<ReportLine> result1 = t1.join();
        List<ReportLine> result2 = t2.join();
        List<ReportLine> result3 = t3.join();

        result.addAll(result1);
        result.addAll(result2);
        result.addAll(result3);

        return result;

    }

}

class ReportLine {
    String id;

    public ReportLine(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "ReportLine{"  
            "id='"   id   '''  
            '}';
    }
}

Kotlin开发者社区

专注分享 Java、 Kotlin、Spring/Spring Boot、MySQL、redis、neo4j、NoSQL、Android、JavaScript、React、Node、函数式编程、编程思想、"高可用,高性能,高实时"大型分布式系统架构设计主题。

High availability, high performance, high real-time large-scale distributed system architecture design

分布式框架:Zookeeper、分布式中间件框架等

分布式存储:GridFS、FastDFS、TFS、MemCache、redis等

分布式数据库:Cobar、tddl、Amoeba、Mycat

云计算、大数据、AI算法

虚拟化、云原生技术

分布式计算框架:MapReduce、Hadoop、Storm、Flink等

分布式通信机制:Dubbo、RPC调用、共享远程数据、消息队列等

消息队列MQ:Kafka、MetaQ,RocketMQ

怎样打造高可用系统:基于硬件、软件中间件、系统架构等一些典型方案的实现:HAProxy、基于Corosync Pacemaker的高可用集群套件中间件系统

Mycat架构分布式演进

大数据Join背后的难题:数据、网络、内存和计算能力的矛盾和调和

Java分布式系统中的高性能难题:AIO,NIO,Netty还是自己开发框架?

高性能事件派发机制:线程池模型、Disruptor模型等等。。。

0 人点赞