I am testing the Fibonacci example using RecursiveTask in Java SE 7 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html.
The program is as follows:
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();
}
}
However, the program throws a run-time exception
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)
I googled about this issue but could not figure out the problem.
Thanks for your help.
================
Solution:
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);
}
}
You're misusing ForkJoinTask.
The point of ForkJoinTasks is to execute them within a ForkJoinPool.
The pool will call the compute()
methods of the tasks for you in its ForkJoinWorkerThreads.
You should not call compute()
directly.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With