- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
subtask.fork() 返回 ForkJoinTask<Int>
后会发生什么目的?此后多次调用 compute() 方法,但从何处以及如何调用?
我是 Java 新手,正在尝试学习 fork/join 框架的概念。我在网上看到了下面的代码。我在阅读 Java API 后知道 subtask.fork()
返回 ForkJoinTask<V>
的对象,这是一个 ForkJoinTask<Int>
在这种情况下。我无法理解的是那之后会发生什么?输出表明 compute()
方法在此之后被调用了很多次,但是从哪里以及如何调用?
public class MyRecursiveAction extends RecursiveAction {
public static void main(String[] args) {
MyRecursiveAction mra1 = new MyRecursiveAction(100);
ForkJoinPool fjp1 = new ForkJoinPool();
fjp1.invoke(mra1);
}
private long workLoad = 0;
public MyRecursiveAction(long workLoad) {
this.workLoad = workLoad;
}
@Override
protected void compute() {
//if work is above threshold, break tasks up into smaller tasks
if(this.workLoad > 16) {
System.out.println("Splitting workLoad : " + this.workLoad);
List<MyRecursiveAction> subtasks =
new ArrayList<MyRecursiveAction>();
subtasks.addAll(createSubtasks());
for(RecursiveAction subtask : subtasks){
subtask.fork();
}
} else {
System.out.println("Doing workLoad myself: " + this.workLoad);
}
}
private List<MyRecursiveAction> createSubtasks() {
List<MyRecursiveAction> subtasks =
new ArrayList<MyRecursiveAction>();
MyRecursiveAction subtask1 = new MyRecursiveAction(this.workLoad / 2);
MyRecursiveAction subtask2 = new MyRecursiveAction(this.workLoad / 2);
subtasks.add(subtask1);
subtasks.add(subtask2);
return subtasks;
}
}
输出:
Splitting workLoad : 100
Splitting workLoad : 50
Splitting workLoad : 50
Splitting workLoad : 25
Doing workLoad myself: 12
Doing workLoad myself: 12
Splitting workLoad : 25
Doing workLoad myself: 12
Doing workLoad myself: 12
Splitting workLoad : 25
Doing workLoad myself: 12
Splitting workLoad : 25
Doing workLoad myself: 12
Doing workLoad myself: 12
Doing workLoad myself: 12
最佳答案
您需要调用 invokeAll 以便将您的工作分成两部分而不是手动进行,然后将创建 2 个新线程来“计算”您的结果,然后如果它不够小,则创建 2 个新线程,依此类推..,
您无法预测线程的执行顺序,因此每次运行此代码时消息顺序都会有所不同。
public class MyRecursiveAction extends RecursiveAction {
public static void main(String[] args) {
MyRecursiveAction mra1 = new MyRecursiveAction(100);
ForkJoinPool fjp1 = new ForkJoinPool();
fjp1.invoke(mra1);
}
private long workLoad = 0;
public MyRecursiveAction(long workLoad) {
this.workLoad = workLoad;
}
@Override
protected void compute() {
//if work is above threshold, break tasks up into smaller tasks
if(this.workLoad > 16) {
System.out.println("Splitting workLoad : " + this.workLoad);
invokeAll(new MyRecursiveAction(this.workLoad / 2), new MyRecursiveAction(this.workLoad / 2));
} else {
System.out.println("Doing workLoad myself: " + this.workLoad);
}
}
}
关于java - ForkJoinTask的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35676690/
我有一个长时间运行的计算,已与 Java's ForkJoinTask 分开. Java's FutureTask提供了一个模板方法done()。 Overriding this method all
我正在尝试 Java ForkJoin 框架并编写了一个程序来处理大型数据列表。 众所周知,ForkJoinTask 中总是设置字段阈值来指出数据列表分区的最小数量。 问题是,阈值设置多大或小会带来更
在 Java 8 中有两种启动异步计算的方法 - CompletableFuture和 ForkJoinTask .它们看起来都非常相似 - CompletableFuture 的内部类甚至扩展 Fo
JavaDoc ForkJoinTask 说: [R]eturns (joins) should be performed innermost-first. For example, a.fork()
前段时间我发现了 Scala Async Project .问题是:这个不能通过普通函数(没有宏扩展)实现的 async block 有什么神奇之处? 让我们看一下介绍中的第一个例子: import
API 说:“方法invokeAll(有多个版本)执行最常见的并行调用形式: fork 一组任务并将它们全部连接起来。” 所以我的假设是,如果我使用 invokeAll(),我就不再需要使用 fork
当我在阅读时 the javadoc about ForkJoinTask我遇到了以下声明: This method may be invoked only from within ForkJoinP
我目前正在评估各种并发解决方案来解决业务问题。该用例类似于“尴尬并行”算法。 基本上,对于单个用户请求,我们需要在计算响应之前从多个不同的数据源检索数据。目前,所有 3 个 DAO 调用都是串行进行的
是否有计划利用 java 7 util.concurrent 的 ForkJoin API 或在 Akka 中公开类似的 API? 最佳答案 我们一直在与 Doug Lea 合作改进 Akka 的 F
“在 ForkJoinPool 中运行的任务的抽象基类。ForkJoinTask 是一个类似线程的实体,比普通线程轻得多。大量的任务和子任务可能由中的少量实际线程托管一个 ForkJoinPool,以
我正在阅读 Java ForkJoin 框架。不直接在 ForkJoinTask 的实现上调用 invoke()(例如 RecursiveTask),而是实例化 ForkJoinPool 有什么额外的
假设我们扩展了一个名为 MyRecursiveTask 的 RecursiveTask。 然后在 forkJoinTask 的范围内创建两个子任务: MyRecursiveTask t1 = new
我一直在使用Java7的Fork/Join并发框架,效果不错。我终于开始阅读 ForkJoinTask 的 API 的 javadoc,它包含以下段落: ForkJoinTasks should pe
来源: public static void invokeAll(ForkJoinTask t1, ForkJoinTask t2) { t2.fork(); t1.invoke();
这是 javadoc对于两者: get():必要时等待计算完成,然后检索其结果。 invoke():开始执行这个任务,如有必要,等待其完成,并返回其结果,或者抛出一个(未经检查的)RuntimeExc
我是一名优秀的程序员,十分优秀!