首页 > 编程语言 >Java实现并行功能

Java实现并行功能

时间:2023-11-27 23:37:29浏览次数:22  
标签:功能 Java 处理 ForkJoinPool 并行 任务 线程 threshold MyTask

Java8 线程池异步处理 --> 针对小包大

MyTask 类中的 compute() 方法首先检查任务的规模是否小于等于 1。如果是,它直接返回任务的结果。否则,它将任务拆分成两个子任务(leftTask 和 rightTask),并使用 fork() 方法将它们提交到 ForkJoinPool 中执行。

这里定义了一个名为 MyTask 的可并行任务,它将一个整数拆分成两个子任务,并使用 fork() 方法将它们提交到 ForkJoinPool 中执行。 然后,使用 join() 方法等待所有子任务完成,并将它们的结果汇总起来。 ForkJoinPool 适合处理可并行的任务,并且在处理大量数据时可以提供较好的性能。 但是,对于需要长时间运行的任务,使用 ForkJoinPool 可能会导致线程阻塞,影响性能。 在这种情况下,可能需要考虑使用其他的线程池实现,或者使用其他的并行计算框架。   如果在任务执行过程中发生异常,异常会被传播到 join() 方法中,然后在那里进行处理。可以根据具体的需求在 catch 块中处理异常,例如打印异常信息或采取其他适当的操作。 在处理异常时,需要根据具体的情况进行适当的处理,以确保程序的正确性和可靠性。 代码框架如下:
import java.util.concurrent.ForkJoinPool;

public class ForkJoinExample {
    public static void main(String[] args) {
        // 创建一个 ForkJoinPool,线程数为可用处理器数量
        ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());

        // 定义可并行任务
        MyTask myTask = new MyTask(100);

        // 提交任务到 ForkJoinPool 执行
        forkJoinPool.submit(myTask);

        // 等待任务完成
        try {
            myTask.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class MyTask extends RecursiveTask<Integer> {
    private final int threshold;

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

    @Override
    protected Integer compute() {
        if (threshold <= 1) {
            return threshold;
        } else {
            int left = threshold / 2;
            int right = threshold - left;

            MyTask leftTask = new MyTask(left);
            MyTask rightTask = new MyTask(right);

            leftTask.fork();
            rightTask.fork();

            try {
                return leftTask.join() + rightTask.join();
            } catch (InterruptedException e) {
                // 在这里处理异常
                e.printStackTrace();
            } catch (Throwable t) {
                // 在这里处理异常
                t.printStackTrace();
            }

            return 0;
        }
    }
}

  

标签:功能,Java,处理,ForkJoinPool,并行,任务,线程,threshold,MyTask
From: https://www.cnblogs.com/security-guard/p/ForkJoinPool.html

相关文章

  • 内核模块开发入门指南:在CentOS 7上实现自定义功能
    内核模块开发入门指南:在CentOS7上实现自定义功能在CentOS7及其他Linux系统中,内核模块是一种动态加载到内核中的代码,用于扩展内核的功能。内核模块的开发允许开发者在不重新编译内核的情况下,添加新的功能、驱动或调整系统行为。本文将带你入门内核模块的开发,在CentOS7上实现自......
  • java System
    packagenet.elaina.system;publicclassTest1{publicstaticvoidmain(String[]args){/*publicstaticvoidexit(intstatus)终止当前运行的Java虚拟机publicstaticlongcurrentTimeMillis()返回当前系统的时间毫秒值形式p......
  • 支持修改键值的优先队列(以C++,Java为例)
    #include<queue>#include<functional>template<typenameT1,typenameT2>classmutable_priority_queue;template<typenameT1,typenameT2>classmutable_priority_queue{private:std::function<bool(conststd::pair<T1,T......
  • Java的Buffer流输入封装类
    importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.StringTokenizer;classQuickReader{privatefinalBufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(System.in));......
  • 八股文-Java方法的重载与重写
    在Java中,重载和重写是两个关键的面向对象编程概念。重载通过方法的参数列表不同来区分同名方法,提供了更灵活的方法调用方式。而重写通过子类重新定义父类中已经存在的方法,实现了多态性的体现,让代码更具可扩展性和维护性。重载(Overloading)重载是指在同一个类中可以定义多个方法......
  • Java换行输出
    Java换行输出的五种方法第一种:(println)System.out.print("#123");System.out.pritn("$123");//print--不会换行输出输出#123$123System.out.print("#123");System.out.println("$123");//println--输出时直接换行或者System.out.println("$123&......
  • JavaSE练习,JDBC驱动,基于swing库的带登录功能计算器
    一、前言本次作业是基于上次的计算器功能所做的改进,通过JDBC连接MySQL增加了登录与注册功能,并对计算器所作的运算进行了记录。虽然基于上次的作业所作,但是设计编写的模块大部分与之无关(登录注册自然与计算器无关)。所以本次作业属于再开发而不是运营维护。二、概要设计......
  • 我想问下为什么我这个flask查询功能实现不了?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【乔.】问了一个Python web开发的问题,一起来看看吧。问题描述:大佬们,我想问下为什么我这个查询功能实现不了<!DOCTYPEhtml><html><head><title>SearchResults</title></head><body><h1>SearchResults</h1><!--添加......
  • LeetCode-Java:27.移除元素
    题目给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数......
  • LeetCode-Java:80.删除有序数组中的重复项 II
    题目给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入......