1. 程式人生 > 其它 >最近的幾個技術問題總結和答疑 (r8筆記第19天)

最近的幾個技術問題總結和答疑 (r8筆記第19天)

Fork/Join框架強調任務的分解。
該框架主要有Fork,join兩個操作組成,Fork操作主要用於對任務和資料進行劃分。join操作用於對各個部分的執行結果進行合併
該框架有一個重要的方法,叫做工作竊取法,當一個執行緒完成任務時,會去檢視其它執行緒是否完成了任務,如果沒有,就將竊取一部分任務來處理,提高效率和資源利用率

繼承RecursiveTask類,重寫compute方法。來建立執行緒任務

package com.luoKing.ForkJoin;


import java.util.concurrent.RecursiveTask;

public class ForkJTask extends RecursiveTask<Long>{
    //計算1-10_0000_0000的和
    //具體任務
    private Long start;
    private Long end;
    private int temp = 5_0000;//門檻值



    public ForkJTask(Long start, Long end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        if((end-start)<temp){
            Long sum = 0L;//總結果
            for (Long i = start; i <= end; i++) {
                sum +=i;
            }
            return sum;
        }else{
            Long middle = (start+end)/2;//中間值
            ForkJTask task1 = new ForkJTask(start, middle);//任務1
            task1.fork();//拆分任務,將執行緒壓入佇列
            ForkJTask task2 = new ForkJTask(middle + 1, end);
            task2.fork();
            return task1.join()+task2.join();//合併結果
        }
    }
}

使用ForkJoinPool類來啟動執行緒任務

package com.luoKing.ForkJoin;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;

public class test {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJTask forkJTask = new ForkJTask(0L,10_0000_0000L);
        ForkJoinTask<Long> submit = forkJoinPool.submit(forkJTask);
        System.out.println(submit.get());

    }
}

Fork/Join框架的程式設計模式決定了它更適合具有遞迴操作的程式,通常需要程式設計師手動設定閾值。可操作性強