5

Java SE 7 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.htmlで RecursiveTask を使用してフィボナッチの例をテストしています。

プログラムは次のとおりです。

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);
        }
}
4

2 に答える 2

7

ForkJoinTask を誤用しています。

ForkJoinTasks のポイントは、それらをForkJoinPool内で実行することです。
プールはcompute()、ForkJoinWorkerThreads でタスクのメソッドを呼び出します。

compute()直接電話してはいけません。

于 2012-12-16T17:02:52.510 に答える
0

RecursiveActionfork-join フレームワークで使用することを想定していない を作成しています。代わりに、ForkJoinPoolを作成してタスクを実行させる必要があります。

たとえば、Java で fork-join を使用してフィボナッチを計算する方法の例については、この記事を参照してください。

于 2012-12-16T17:04:46.443 に答える