2012-12-16 13 views
5

पर जाया नहीं जा सकता है। मैं जावा एसई 7 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html में रिकर्सिव टास्क का उपयोग कर फाइबोनैकी उदाहरण का परीक्षण कर रहा हूं।java.lang.Thread को java.util.concurrent.ForkJoinWorkerTread

कार्यक्रम इस प्रकार है:

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) 

मैं इस मुद्दे के बारे googled फेंकता है लेकिन समस्या को समझ नहीं सकता है।

आपकी मदद के लिए धन्यवाद।

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

समाधान:

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

आप ForkJoinTask का दुरुपयोग कर रहे हैं।

फोर्कजोइन टास्क का बिंदु उन्हें ForkJoinPool के भीतर निष्पादित करना है।
पूल आपके फोर्कजॉइनवर्कर थ्रेड में आपके लिए कार्यों के compute() विधियों को कॉल करेगा।

आपको सीधे compute() पर कॉल नहीं करना चाहिए।

0

आप RecursiveAction बना रहे हैं, जिसका उपयोग फोर्क-जॉइन फ्रेमवर्क के साथ नहीं किया जाना चाहिए। इसके बजाय आप एक ForkJoinPool बनाने और इसे अपने कार्यों को

पर अमल कैसे फिबोनैकी गणना करने के लिए जावा में कांटा-में शामिल होने के उपयोग का एक उदाहरण पर उदाहरण this article के लिए देखते हैं की जरूरत है।