2012-12-16 14 views
5

Ich teste das Fibonacci-Beispiel mit RecursiveTask in Java SE 7 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html.java.lang.Thread kann nicht in java.util.concurrent.ForkJoinWorkerThread umgewandelt werden

Das Programm ist wie folgt:

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

Allerdings wirft das Programm eine Laufzeitausnahme

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) 

ich zu diesem Problem gegoogelt kann aber nicht das Problem herauszufinden.

Danke für Ihre Hilfe.

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

Lösung:

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

Antwort

7

Sie ForkJoinTask missbräuchlich sind.

Der Punkt von ForkJoinTasks ist, sie innerhalb einer ForkJoinPool auszuführen.
Der Pool wird die compute() Methoden der Aufgaben für Sie in ForkJoinWorkerThreads aufrufen.

Sie sollten compute() nicht direkt anrufen.

0

Sie erstellen eine RecursiveAction, die nicht mit dem Fork-Join-Framework verwendet werden soll. Stattdessen müssen Sie eine ForkJoinPool erstellen und lassen Sie es Ihre Aufgaben ausführen

Siehe beispielsweise this article für ein Beispiel zur Berechnung von Fibonacci mit Gabel-Join in Java.

Verwandte Themen