Как многопоточность с потоками, сгенерированными в al oop? - PullRequest
0 голосов
/ 28 апреля 2020

Итак, я пишу код, который будет анализировать несколько текстовых файлов в папке, собирать информацию о них и помещать эту информацию в две переменные c Список переменных экземпляра. Порядок размещения информации не имеет значения, так как я все равно ее отсортирую. Но по какой-то причине увеличение количества потоков не влияет на скорость. Вот мой метод run и часть моего основного метода, который использует многопоточность.

public void run() {
    parseFiles();
}
public static void main(String[] args) {
    while (filesLeft != 0) {
        Thread t = new Thread(new fileParser());
        t.start();
        try {
            t.join();
        }
        catch (InterruptedException e) {
            System.out.println("error.");
        }
}

Если требуется дополнительная информация, я в основном имею переменную экземпляра stati c в виде массива файлов, которые мне нужны go через, а также постоянное число потоков (которое изменяется вручную в целях тестирования). Если бы я имел, скажем, 4 потока и 8 файлов, каждый вызов parseFiles проходит через следующие 2 файла массива, индексы отслеживаются переменной экземпляра stati c. Если бы у меня было, скажем, 4 потока и 9 файлов, первый поток анализирует 3 файла, следующий анализ 2, с оператором что-то вроде filesToParse = Math.ceil(filesLeft / threadsLeft), причем последние две переменные в функции потолка являются stati c как хорошо.

Есть ли какая-либо ошибка в моем коде, или я должен просто тестировать большие текстовые файлы с большим количеством слов, чтобы увидеть снижение скорости с добавленными потоками (в настоящее время у меня есть 5 текстовых файлов каждый с 20+ параграфами, и я получить около 60-70 мс).

1 Ответ

0 голосов
/ 28 апреля 2020

Написал фрагмент кода, который может быть полезен

public static void main(String[] args) {
    long startTime = System.nanoTime();

    final List<Runnable> tasks = generateTasks(NUM_TASKS);
    List<Thread> threadPool = new LinkedList<>();

    for(int i = 0; i < NUM_THREADS; i++) {
        Thread thread = new Thread(() -> {
            Runnable task = null;
            while ((task = getTask(tasks)) != null) {
                task.run();
            }
        });
        threadPool.add(thread);
        thread.start();
    }

    for(Thread thread: threadPool) {
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    long runTimeMs = (System.nanoTime() - startTime) / 1000000;
    System.out.println(String.format("Ran %d tasks with %d threads in %d ms", NUM_TASKS, NUM_THREADS, runTimeMs));
}

private static Runnable getTask(List<Runnable> tasks) {
    synchronized (tasks) {
        return tasks.isEmpty() ? null : tasks.remove(0);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...