Hardforkjoin
Что такое ForkJoinPool?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
ForkJoinPool (Java 7) — ExecutorService для divide-and-conquer задач через work-stealing: каждый worker имеет свою deque; когда пуст — крадёт задачу с tail-а другого worker-а.
class SumTask extends RecursiveTask<Long> {
private final long[] arr; private final int lo, hi;
protected Long compute() {
if (hi - lo < THRESHOLD) return sumDirectly();
SumTask left = new SumTask(arr, lo, mid);
SumTask right = new SumTask(arr, mid, hi);
left.fork(); // асинхронно запустить
return right.compute() + left.join(); // дождаться результата
}
}- Задачи:
RecursiveAction(без результата) илиRecursiveTask<V>; - Меньше contention, лучше балансировка нагрузки;
parallelStream()используетForkJoinPool.commonPool()(размер = availableProcessors - 1);- Ограничение: задачи должны быть disjoint, без blocking I/O (иначе все потоки заблокированы, work-stealing ломается);
- Для I/O — отдельный Executor;
Managedblockerдля blocking внутри FJP.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.