2012-12-16 21 views
5

Tôi đang thử nghiệm ví dụ Fibonacci sử dụng RecursiveTask trong Java SE 7 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html.java.lang.Thread không thể chuyển sang java.util.concurrent.ForkJoinWorkerThread

Chương trình này là như sau:

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

Tuy nhiên, chương trình ném một thời gian chạy ngoại lệ

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) 

Tôi googled về vấn đề này nhưng không thể tìm ra vấn đề.

Cảm ơn sự giúp đỡ của bạn.

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

Giải pháp:

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

Trả lời

7

Bạn đang lạm dụng ForkJoinTask.

Điểm của ForkJoinTasks là thực hiện chúng trong một ForkJoinPool.
Bể bơi sẽ gọi phương thức compute() của các tác vụ cho bạn trong ForkJoinWorkerThreads của nó.

Bạn không nên gọi trực tiếp compute().

0

Bạn đang tạo một RecursiveAction, vốn không được sử dụng với khung ngã ba. Thay vào đó, bạn cần phải tạo một ForkJoinPool và để cho nó thực thi các nhiệm vụ của bạn

Xem ví dụ this article về ví dụ về cách tính toán giá trị bằng cách sử dụng tính năng ngã ba tham gia trong Java.

Các vấn đề liên quan