Aplicación de marco de tareas de ejecución paralela de programación concurrente de Java-Fork-Join

Aplicación de marco de tareas de ejecución paralela Fork-Join

Ejemplo 1

Todos sabemos que hay dos pasos en la clasificación rápida:
Paso 1, tome el primer elemento de la matriz y divida el elemento en dos mitades. La de la izquierda es más pequeña que el elemento y la de la derecha es más grande que el elemento;
el segundo paso es la derecha y la izquierda. Las 2 submatrices se ordenan por separado.

Se puede ver que las submatrices izquierda y derecha aquí se pueden calcular de forma independiente y en paralelo. Para que pueda usar el marco ForkJoin, el código es el siguiente:

//定义一个Task,基础自RecursiveAction,实现其compute方法
class SortTask extends RecursiveAction {
    
    
    final long[] array;
    final int lo;
    final int hi;
    private int THRESHOLD = 0; //For demo only
 
    public SortTask(long[] array) {
    
    
        this.array = array;
        this.lo = 0;
        this.hi = array.length - 1;
    }
 
    public SortTask(long[] array, int lo, int hi) {
    
    
        this.array = array;
        this.lo = lo;
        this.hi = hi;
    }
 
    protected void compute() {
    
    
        if (hi - lo < THRESHOLD)
            sequentiallySort(array, lo, hi);
        else {
    
    
            int pivot = partition(array, lo, hi);  //划分
            coInvoke(new SortTask(array, lo, pivot - 1), new SortTask(array,
                    pivot + 1, hi));  //递归调,左右2个子数组
        }
    }
 
    private int partition(long[] array, int lo, int hi) {
    
    
        long x = array[hi];
        int i = lo - 1;
        for (int j = lo; j < hi; j++) {
    
    
            if (array[j] <= x) {
    
    
                i++;
                swap(array, i, j);
            }
        }
        swap(array, i + 1, hi);
        return i + 1;
    }
 
    private void swap(long[] array, int i, int j) {
    
    
        if (i != j) {
    
    
            long temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
 
    private void sequentiallySort(long[] array, int lo, int hi) {
    
    
        Arrays.sort(array, lo, hi + 1);
    }
}
 
 
//测试函数
    public void testSort() throws Exception {
    
    
        ForkJoinTask sort = new SortTask(array);   //1个任务
        ForkJoinPool fjpool = new ForkJoinPool();  //1个ForkJoinPool
        fjpool.submit(sort); //提交任务
        fjpool.shutdown(); //结束。ForkJoinPool内部会开多个线程,并行上面的子任务
 
        fjpool.awaitTermination(30, TimeUnit.SECONDS);
    }

Ejemplo 2: Encuentra la suma de 1 an números

//定义一个Task,基础自RecursiveTask,实现其commpute方法
public class SumTask extends RecursiveTask<Long>{
    
      
    private static final int THRESHOLD = 10;  
 
    private long start;  
    private long end;  
 
    public SumTask(long n) {
    
      
        this(1,n);  
    }  
 
    private SumTask(long start, long end) {
    
      
        this.start = start;  
        this.end = end;  
    }  
 
    @Override  //有返回值
    protected Long compute() {
    
      
        long sum = 0;  
        if((end - start) <= THRESHOLD){
    
      
            for(long l = start; l <= end; l++){
    
      
                sum += l;  
            }  
        }else{
    
      
            long mid = (start + end) >>> 1;  
            SumTask left = new SumTask(start, mid);   //分治,递归
            SumTask right = new SumTask(mid + 1, end);  
            left.fork();  
            right.fork();  
            sum = left.join() + right.join();  
        }  
        return sum;  
    }  
    private static final long serialVersionUID = 1L;  
}  
 
//测试函数
    public void testSum() throws Exception {
    
    
        SumTask sum = new SumTask(100);   //1个任务
        ForkJoinPool fjpool = new ForkJoinPool();  //1个ForkJoinPool
        Future<Long> future = fjpool.submit(sum); //提交任务
        Long r = future.get(); //获取返回值
        fjpool.shutdown(); 
 
    }

referencia

Guía de programación concurrente de Java 15: Análisis del marco de concurrencia de bifurcación / unión y algoritmo de robo de trabajo

Supongo que te gusta

Origin blog.csdn.net/e891377/article/details/108877162
Recomendado
Clasificación