fork/join框架_java forkjoinpool_fork join框架(3)

电脑杂谈  发布时间:2017-04-10 18:05:20  来源:网络整理


    for (int i=0; i<size; i++){

        Product product=new Product();

        product.setName("Product "+i);

        product.setPrice(10);

        ret.add(product);

    }

    return ret;

}

8.创建一个名为Task的类,并继承RecursiveAction类。

public class Task extends RecursiveAction {

9.声明这个类的serialVersionUID属性。这个元素是必需的,因为RecursiveAction的父类ForkJoinTask实现了Serializable接口。

private static final long serialVersionUID = 1L;

10.声明一个名为products私有的List属性。

private List<Product> products;

11.声明两个私有的int属性,分别命名为first和last。这两个属性将决定任务执行时对产品的分块。

private int first;

private int last;

12.声明一个名为increment的私有double属性,用来存储产品价格的增加额。

private double increment;

13.实现类的构造器,用来初始化类的这些属性。

public Task (List<Product> products, int first, int last, double

    increment) {

    this.products=products;

    this.first=first;

    this.last=last;

    this.increment=increment;

}

14.实现compute()方法,实现任务的执行逻辑。

@Override

protected void compute() {

15.如果last和first属性值的差异小于10(一个任务只能更新少于10件产品的价格),则调用updatePrices()方法增加这些产品的价格。

if (last-first<10) {

    updatePrices();

16.如果last和first属性值的差异大于或等于10,就创建两个新的Task对象,一个处理前一半的产品,另一个处理后一半的产品,然后调用ForkJoinPool的invokeAll()方法来执行这两个新的任务。

} else {

    int middle=(last+first)/2;

    System.out.printf("Task: Pending tasks:

%s\n",getQueuedTaskCount());

    Task t1=new Task(products, first,middle+1, increment);

    Task t2=new Task(products, middle+1,last, increment);

    invokeAll(t1, t2);

}

17.实现updatePrices()方法。这个方法用来更新在产品列表中处于first和last属性之间的产品。

private void updatePrices() {

    for (int i=first; i<last; i++){

        Product product=products.get(i);

        product.setPrice(product.getPrice()*(1+increment));

    }

}


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40557-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...