• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Java实现多线程ForkJoinPool的案例

java 搞代码 4年前 (2022-01-09) 13次浏览 已收录 0个评论

这篇文章主要介绍了Java多线程ForkJoinPool实例详解,涉及forkjoin框架的相关内容,需要的朋友可以参考下。

引言

java 7提供了另外一个很有用的线程池框架,Fork/Join框架

理论

Fork/Join框架主要有以下两个类组成.

* ForkJoinPool 这个类实现了ExecutorService接口和工作窃取算法(Work-Stealing Algorithm).它管理工作者线程,并提供任务的状态信息,以及任务的执行信息

* ForkJoinTask 这个类是一个将在ForkJoinPool执行的任务的基类.

Fork/Join框架提供了在一个任务里执行fork()和join()操作的机制和控制任务状态的方法.通常,为了实现Fork/Join任务,需要实现一个以下两个类之一的子类

* RecursiveAction 用于任务没有返回值的场景

* RecursiveTask 用于任务有返回值的场景.

例子 先定个小目标,1亿就太多,先赚个一百万吧

现在你是一个深圳片区的某公司高级销售主管.现在定了一个目标,就是要赚个一百,让你一个人去赚,肯定有难度的.好在有一般手下,把目标缩小,让小弟们去赚,我们坐等拿钱.ok,开始编程

首先我们要定义个赚钱任务 MakeMoneyTask,如果要赚钱的目标小于最小目标,比如十万,那么就自己去完成,否则,就把任务分给小弟们去做.

public class MakeMoneyTask extends RecursiveTask<Integer>{  private static final int MIN_GOAL_MONEY = 100000;  private int goalMoney;  private String name;  private static final AtomicLong employeeNo = new AtomicLong();  public MakeMoneyTask(int goalMoney){    this.goalMoney = goalMoney;    this.name = "员工" + employeeNo.getAndIncrement() + "号";  }  @Override  protected Integer compute() {    if (this.goalMoney < MIN_GOAL_MONEY){      System.out.println(name + ": 老板交代了,要赚 " + goalMoney + " 元,为了买车买房,加油吧....");      return makeMoney();    }else{      int subThreadCo<i>本文来源gaodai$ma#com搞$$代**码)网@</i>unt = ThreadLocalRandom.current().nextInt(10) + 2;      System.out.println(name + ": 上级要我赚 " + goalMoney + ", 有点小多,没事让我" + subThreadCount + "个手下去完成吧," +          "每人赚个 " + Math.ceil(goalMoney * 1.0 / subThreadCount) + "元应该没问题...");      List<MakeMoneyTask> tasks = new ArrayList<>();      for (int i = 0; i < subThreadCount; i ++){        tasks.add(new MakeMoneyTask(goalMoney / subThreadCount));      }      Collection<MakeMoneyTask> makeMoneyTasks = invokeAll(tasks);      int sum = 0;      for (MakeMoneyTask moneyTask : makeMoneyTasks){        try {          sum += moneyTask.get();        } catch (Exception e) {          e.printStackTrace();        }      }      System.out.println(name + ": 嗯,不错,效率还可以,终于赚到 " + sum + "元,赶紧邀功去....");      return sum;    }  }  private Integer makeMoney(){    int sum = 0;    int day = 1;    try {      while (true){        Thread.sleep(ThreadLocalRandom.current().nextInt(500));        int money = ThreadLocalRandom.current().nextInt(MIN_GOAL_MONEY / 3);        System.out.println(name + ": 在第 " + (day ++) + " 天赚了" + money);        sum += money;        if (sum >= goalMoney){          System.out.println(name + ": 终于赚到 " + sum + " 元, 可以交差了...");          break;        }      }    } catch (InterruptedException e) {      e.printStackTrace();    }    return sum;  }}

最后我们写一个测试类

public class TestMain {  public static void main(String[] args) throws ExecutionException, InterruptedException {    ForkJoinPool pool = new ForkJoinPool();    ForkJoinTask<Integer> task = pool.submit(new MakeMoneyTask(1000000));    do {      try {        TimeUnit.MILLISECONDS.sleep(5);      }catch (InterruptedException e){        e.printStackTrace();      }    }while (!task.isDone());    pool.shutdown();    System.out.println(task.get());  }}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java实现多线程ForkJoinPool的案例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址