当前位置: 首页 > article >正文

java多线程中的Fork和Join

文章目录

    • 1. 简介
    • 2. 使用

1. 简介

Fork/Join是JDK 1.7中加入的新的线程池的实现,它体现的使用分治的思想,适用于能够进行任务拆分的cpu密集型任务。所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直到不能拆分可以直接求解。Fork/Join载分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率。Fork/Join默认会创建于cpu核心大小相同的线程池。

2. 使用

public class TestFinal {
    public static void main(String[] args) {
        //创建线程池,里面有四个线程
        ForkJoinPool pool = new ForkJoinPool(4);
        //执行任务
        System.out.println(pool.invoke(new MyTask(5)));
        /**
         * 任务拆分 new MyTask(5)= 5+ {new MyTask(4)=4+new MyTask(3)....}
         */
    }
}

//1. 继承父类RecursiveTask,范型时Integer即任务结果的返回值,下面任务时计算1-100的和
class MyTask extends RecursiveTask<Integer> {
    private int n;

    public MyTask(int n) {
        this.n = n;
    }

    @Override
    protected Integer compute() {
        if (n == 1) {
            return 1;
        }
        MyTask myTask = new MyTask(n - 1);
        myTask.fork(); //让另外一个线程去执行这个结果
        int result = n + myTask.join(); //获取另一个线程的结果
        return result;
    }
}

在这里插入图片描述
任务执行的结果实际如下所示:
在这里插入图片描述


http://www.kler.cn/news/134505.html

相关文章:

  • 图片地址GPS经纬度查询
  • shadow复习之planar shadow
  • Linux中安装部署环境(JAVA)
  • Idea安装完成配置
  • ajax异步传值以及后端接收参数的几种方式
  • c#正则表达式
  • 解决更换NodeJs版本后npm -v返回空白
  • 00后如何组织双十一大促看这一篇就够了! | 京东云技术团队
  • 互联网上门洗衣洗鞋小程序搭建
  • Docker之DockerFile解析
  • 使用Flink处理Kafka中的数据_题库子任务_Java语言实现
  • SpringCloud-Gateway修改Response响应体,并解决大数据量返回不全等问题
  • 关于ASO优化的分步入门指南2
  • 生成对抗网络Generative Adversarial Network,GAN
  • 【前沿学习】美国零信任架构发展现状与趋势研究
  • TypeError 异常详细解析
  • Java-拼图小游戏
  • 6.2 List和Set接口
  • 力扣hot100 两数之和 哈希表
  • unexpected end of stream on
  • vue3按需引入 vite-plugin-style-import 2.0版本报错(解决办法)
  • 软件测试/测试开发/人工智能丨视觉与图像识别自动化测试
  • JAXB:用XmlElement注解复杂类型的Java属性,来产生多层嵌套的xml元素
  • 基于C++实现循环赛日程表(分治算法)
  • 导向矢量(Steering Vector)和束波权重
  • Linux(2):初探
  • APP外包开发需要注意的问题
  • 二十三种设计模式:解密职责链模式-购物优惠活动的设计艺术
  • KVM网络环境下vlan和trunk的理解
  • Angular菜单项激活状态保持