通过ForkJoinPool在Java中进行异步方法调用

时间:2019-12-02 04:37:39

标签: java forkjoinpool

我想了解Fork / Join框架的一些细微差别。有两个包含类的工作应用程序,它们的功能相同,但是有一些区别。

这是第一个应用程序的代码段:

RecursiveTask<HashMap<String, Menu>> task = new RecursiveTask<HashMap<String, Menu>>() {
@Override
protected HashMap<String, Menu> compute() {
List<LoadMenuTask> tasks = new ArrayList<>();
for (Module module : modules) {
    if (module.getIsActive()) {
        LoadMenuTask loadMenuTask = new LoadMenuTask(module, locale);
        tasks.add(loadMenuTask);
        loadMenuTask.fork();
    }
}

 …

for (LoadMenuTask task : tasks) {
    Menu menu = task.join();

 …
}
…
}

这是第二个应用程序中的代码:

RecursiveTask<HashMap<String, Menu>> task = new RecursiveTask<HashMap<String, Menu>>() {
@Override
protected HashMap<String, Menu> compute() {
List<MenuTask> tasks = new ArrayList<>();
for (Module module : modules) {
    if (module.getIsActive()) {
        MenuTask menuTask = new MenuTask(module, locale);
        tasks.add(menuTask);
    }
}

 …

 for (MenuTask task : tasks) {
    forkJoinPool.execute(task);
 }

for (MenuTask task : tasks) {
Menu menu = task.join();
…
}
...
}
};

很明显,两个代码都做同样的事情:创建任务和异步启动它。但是在第一种情况下,使用递归任务的方法 fork(),在第二种情况下,使用ForkJoinPool类的方法 execute()。这些方法之间有什么区别,如果是,那是什么?也许有一些创建异步方法调用的最佳实践?我想对这个话题深有感触,对于任何建议和建议,我们都会感到高兴。

0 个答案:

没有答案