我想了解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()。这些方法之间有什么区别,如果是,那是什么?也许有一些创建异步方法调用的最佳实践?我想对这个话题深有感触,对于任何建议和建议,我们都会感到高兴。