2012-12-16 19 views
5

Java SE 7のhttp://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.htmlでRecursiveTaskを使用してフィボナッチのサンプルをテストしています。次のようにjava.lang.Threadはjava.util.concurrent.ForkJoinWorkerThreadにキャストできません

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

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

しかし、プログラムは、私はこの問題についてGoogleではなく、問題を把握することができませんでしランタイム例外

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) 

をスローします。

ありがとうございました。

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

解決策:ForkJoinTaskを悪用している

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

答えて

7

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

compute()に直接電話をかけてはいけません。

0

RecursiveActionを作成していますが、これはfork-joinフレームワークでは使用されません。代わりにForkJoinPoolを作成してタスクを実行させる必要があります

Javaでfork-joinを使用してfibonacciを計算する方法の例については、たとえばthis articleを参照してください。

関連する問題