Этот JSR первоначально был представлен для библиотек обеспечивающих конкурентный доступ в Джава 5 и также привел к изменениям в Джава 6. Для Джава 7, группа JSR 166 добавит новый вид BlockingQueue называемый TransferQueue и фреймворк для параллельных вычислений основанный на таких принципах: разделяй и властвуй(divide-and-conquer) и украдающий работу (work-stealing).
Work-stealing:
У каждого рабочего(Worker) есть свой стэк (очередь работающая по принципу LIFO) задачь. Как только он выполняет все свои задачи то он пытается «украсть» задачу из стэка другого рабочего рассматривая его очередь — т.е. получая его задачи по принципу FIFO.
Позволяет работу которая может быть выполнена параллельно выполнять на разных ядрах процессора.
Большие (32 и более) ядерные процессоры выйдут во время использования Java 7, существование этого фреймворка позволит людям выполнять приложения для получения относительного простого увеличения производительности для вычислительных задачь. Сейчас forkjoin лучше всего работает на машинах Sun Niagaras и Azuls. Вообще то, вы не получите значительного ускорения с менее чем 4 процессорами из-за — основным назначением является компьютеры с наличием от десяти до сотни процессоров
Пример вычисления чисел Фибоначчи:
Без усовершенствований — обычный код:
int seqFib(int n) {
if (n <= 1)
return n;
else
return seqFib(n-1) + seqFib(n-2);
}
Усовершенствованный код:
class Fib extends FJTask {
static final int sequentialThreshold = 13; // for tuning
volatile int number; // argument/result
Fib(int n) { number = n; }
int getAnswer() {
if (!isDone())
throw new IllegalStateException("Not yet computed");
return number;
}
public void run() {
int n = number;
if (n <= sequentialThreshold) // base case
number = seqFib(n);
else {
Fib f1 = new Fib(n - 1); // create subtasks
Fib f2 = new Fib(n - 2);
coInvoke(f1, f2); // fork then join both
number = f1.number + f2.number; // combine results
}
}
public static void main(String[ ] args) { // sample driver
try {
int groupSize = 2; // 2 worker threads
int num = 35; // compute fib(35)
FJTaskRunnerGroup group = new FJTaskRunnerGroup(groupSize);
Fib f = new Fib(num);
group.invoke(f);
int result = f.getAnswer();
System.out.println("Answer: " + result);
}
catch (InterruptedException ex) {} // die
}
}