2020-03-15 fork/join框架学习(微专业)

一、说明

 

 

 

 

 简单例子:

package ljtao.javase.thread.fork_join.ex1;

import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

/**
 * @author ljtao
 * @date 2020/3/20
 * fork/join 底层是线程池,具体的实现,每个线程有自己的队列来处理,这样提高了执行效率,也不会造成冲突。
 * 也有一个工作窃取的概念,如果有一个线程自己的队列没有任务了,这个线程空闲了,回去帮助其它线程执行他们队列的任务。
 * 普通的线程池,就是所有的线程共同从一个任务队列来拿任务
 */
public class ForkJoinDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        ForkJoinPool forkJoinPool=new ForkJoinPool(10,
                ForkJoinPool.defaultForkJoinWorkerThreadFactory,null,true);


        List<String> list=new ArrayList<>();
        list.add("getUser1");
        list.add("getUser2");
        list.add("getUser3");
        list.add("getUser4");

        HttpJsonRequest task=new HttpJsonRequest(list,0,list.size()-1);
        ForkJoinTask<JSONObject> resultTask =  forkJoinPool.submit(task);
        JSONObject result = resultTask.get();
        System.out.println(result);
    }
}
//任务
class HttpJsonRequest extends RecursiveTask<JSONObject>{

    private List<String> urlList;
    private int start;
    private int end;
    public HttpJsonRequest(List<String> urlList,int start,int end){
        this.urlList=urlList;
        this.start=start;
        this.end=end;
    }
    //就是实际去执行的一个方法入口。(任务拆分)
    @Override
    protected JSONObject compute() {
        int count=end-start;//代表当前这个task需要处理多少数据
        if(count==0){
            //这里输出线程的名称,可以看到是不同的线程在执行拆封的任务
            System.out.println(Thread.currentThread().getName());

            String url=urlList.get(start);
            JSONObject value=new JSONObject();
            value.put(url+","+start+",key",url+","+start+",value");

            return value;

        }else{
            //
            //如果是多个接口调用,拆分成子任务 , 0,1,  2,3
            //不断将任务拆分
            int x=(start+end)/2;
            HttpJsonRequest httpJsonRequest1 = new HttpJsonRequest(urlList, start, x);
            httpJsonRequest1.fork();//继续执行,将任务继续提交到线程池的任务队列中

            HttpJsonRequest httpJsonRequest2=new HttpJsonRequest(urlList,x+1,end);
            httpJsonRequest2.fork();

            //join处理结果
            JSONObject result=new JSONObject();
            result.putAll(httpJsonRequest1.join());
            result.putAll(httpJsonRequest2.join());
            return result;
        }
    }
}

 

posted @ 2020-03-15 15:45  math_lin  阅读(121)  评论(0编辑  收藏  举报