Уважаемые форумчане, Исследую возможности Fork-Join фрэймворка. Написал программку возведения в степень числа.| Код | import java.util.concurrent.*;
public class ForkJoinPow extends RecursiveTask<Double> { private Double x; private int y; public ForkJoinPow(Double x, int y) { this.x = x; this.y = y; } public Double compute() { System.out.println(Thread.currentThread().getName() + " pow is: " + y); if (y > 0) { ForkJoinPow pow = new ForkJoinPow(x, y - 1); pow.fork(); return pow.join() * x; }
return 1d; } public static void main(String[] args) { ForkJoinPow task = new ForkJoinPow(2d, 100); ForkJoinPool pool = new ForkJoinPool(); System.out.println(pool.invoke(task)); System.out.println(pool.getPoolSize()); System.out.println(pool.getParallelism()); } }
|
и вот какой вопрос у меня возник: этой строкой| Код | System.out.println(Thread.currentThread().getName() + " pow is: " + y);
|
я определяю в частности, какой поток сейчас производит вычисление. Так вот, вычисления производят у меня всего 2 потока, хотя пул создается по умолчанию на 3 потока (т. к. на компе 3 проца), и методы| Код | System.out.println(pool.getPoolSize()); System.out.println(pool.getParallelism());
|
возвращают 3. Более того, если написать, к примеру,| Код | ForkJoinPool pool = new ForkJoinPool(10);
|
все равно количество работающих потоков получается меньшим, чем размер пула. Был бы благодарен, если кто-нибудь объяснит мне, в чем тут дело, и насколько корректно я тут вообще реализовал Fork/Join framework. Спасибо! |