java.lang.Thread无法转换为java.util.concurrent.ForkJoinWorkerThread

5
我正在使用Java SE 7中的RecursiveTask测试Fibonacci示例 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html
以下是程序内容:
import java.util.concurrent.*;

public class testfuture{
    public static void main(String[] args) {
        System.out.println("Hello, World");
        Fibonacci fib = new Fibonacci(10);
        int result = fib.compute();
        System.out.println(result);
        }
}

class Fibonacci extends RecursiveTask<Integer> {
    final int n;
    Fibonacci(int n) { this.n = n; }
    public Integer compute() {
        if (n <= 1)
        return n;
        Fibonacci f1 = new Fibonacci(n - 1);
        f1.fork();
        Fibonacci f2 = new Fibonacci(n - 2);
        return f2.invoke() + f1.join();
    }
}

然而,该程序抛出了一个运行时异常。
Hello, World
Exception in thread "main" java.lang.ClassCastException: java.lang.Thread cannot be cast to java.util.concurrent.ForkJoinWorkerThread
    at java.util.concurrent.ForkJoinTask.fork(Unknown Source)
    at Fibonacci.compute(testfuture.java:21)
    at testfuture.main(testfuture.java:9)

我在谷歌上搜索了这个问题,但是无法找出问题所在。

感谢您的帮助。

================

解决方案:

public class testfuture{
    public static void main(String[] args) {
        System.out.println("Hello, World");
        Fibonacci fib = new Fibonacci(10);
        ForkJoinPool pool = new ForkJoinPool();
        int result = pool.invoke(fib);
        //int result = fib.compute(); //run-time exception
        System.out.println(result);
        }
}
2个回答

7

你误用了ForkJoinTask。

ForkJoinTask的目的是在ForkJoinPool中执行它们。
池将在其ForkJoinWorkerThreads中为您调用任务的compute()方法。

您不应直接调用compute()


0
你正在创建一个 RecursiveAction,这不应该与 fork-join 框架一起使用。相反,你需要创建一个 ForkJoinPool 并让它执行你的任务。
例如,可以参考 这篇文章 中的示例,在 Java 中使用 fork-join 计算斐波那契数列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接