Настройка Fork-Join в коде

Есть программа, которая ищет нужные файлы в директории, но мне нужно сделать поиск файлов многопоточным с использованием fork-join. Я думал сделать разделение между потоками по объему файлов, например до 5 мб делает основной поток, а свыше уже подключается второй поток. (кол-во потоков можно сделать 2 или 4, не принципиально), но в коде это нормально не смог сделать, на одном из сайтов посоветовали: Отсортируйте файлы в N списков, а затем запустите N задач для их обработки. N не обязательно должно совпадать с количеством потоков в пуле; если N больше, то некоторые задачи будут ждать

import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

public class  Main{

    static Scanner in = new Scanner(System.in);
    public static final double MIN_LENGTH = in.nextDouble() * 1048576;  // ввод размера файла сразу в Мегабайтах
    static File directory = new File("C:/Users/excit/Desktop");

    static int numOfThreads = 4; // количество потоков, можно и 2 сделать



    public static void main(String[] args) {
        ArrayList<File> fileList = new ArrayList<>();
        getFiles(directory, fileList);
        fileList.sort(Comparator.<File>comparingLong(File::length).reversed());
        DecimalFormat df = new DecimalFormat("#.#");

        ForkJoinPool pool = new ForkJoinPool(numOfThreads);

        for(File file: fileList) {

            if(file.length()>= 1073741824) {
                double Gb = (double) file.length() / 1073741824;
                System.out.printf("%s Gb  %s%n", df.format(Gb), file); // в гигабайтах
            } else if(file.length()>= 1048576) {
                System.out.printf("%s Mb  %s%n", file.length() / 1048576, file); // в мегабайтах
            } else if (file.length()>= 1024){
                System.out.printf("%s Kb  %s%n", file.length() / 1024, file);  // выводит в килобайтах объем
            } else if (file.length()< 1024){
                System.out.printf("%s B  %s%n", file.length(), file); // в байтах
            } else {
                System.out.printf("%s Gb  %s%n", file.length() / (1073741824 * 1024), file); // в терабайтах
            }
        }
    }
    private static void getFiles(File rootFile, List<File> fileList) {
        if (rootFile.isDirectory()) {
            File[] directoryFiles = rootFile.listFiles();
            if (directoryFiles != null) {
                for (File file: directoryFiles) {
                    if (file.isDirectory()) {
                        getFiles(file, fileList);
                    } else {
                        if (file.isFile() && file.length() >= MIN_LENGTH) {
                            fileList.add(file);
                        }
                    }
                }
            }
        }
    }
}

Ответы (0 шт):