Java приблизительно 100 параллельных потоков, управление памятью

Я пишу optimazation алгоритм, который создает приблизительно 100 потоков. В настоящее время я запускаю их все сразу (для цикла), и после этого я говорю каждому потоку, что он должен присоединиться ().

Моя проблема состоит в том теперь, когда каждый поток использует для большой памяти, таким образом, исключение пространства "кучи" не займет много времени. Я хочу некоторое планирование, но не знаю, как реализовать его.

Я имею что-то вроде этого в виду: запустите 10 потоков и каждый раз, когда один из этих концов запускает новый. Так, чтобы там всегда выполнили 10 потоков за один раз, пока никакой поток не оставляют.

Кто-то имеет идею или знает, как понять что-то вроде этого?

Большое спасибо и отношения из Кельна

Marco

9
задан Marco 7 January 2010 в 10:43
поделиться

4 ответа

Рассмотрим количество ядер в используемой машине. Лучше всего, если количество выполняемых потоков будет равно количеству ядер. Как говорит KLE, используйте пул потоков

.
1
ответ дан 4 December 2019 в 08:15
поделиться

Используйте ThreadPoolExecutor с соответствующим максимальным размером пула.

.
19
ответ дан 4 December 2019 в 08:15
поделиться

Вот пример для начала. Сначала, что нужно импортировать:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

А затем, что нужно поместить внутрь своего метода:

    ExecutorService pool = Executors.newFixedThreadPool(10);
    for(final Task task: tasks) { 
        pool.execute(new Runnable() {
            @Override
            public void run() {
                task.execute();
            }
        });
    }
    pool.shutdown();
    while(!pool.awaitTermination(1, TimeUnit.SECONDS)) {
        System.out.println("Waiting for tasks to shutdown");
    }

Некоторые заметки о вышеперечисленном:

  • Вам нужно будет реализовать свой собственный Класс задач, который на самом деле реализует ваш алгоритм
  • Класс задачи не должен просто иметь метод исполнения (на самом деле, если у него есть эта подпись, ты можешь просто получить задание на внедрение Runnable и избегать анонимного внутреннего класса)
  • Вам нужно убедиться, что всё, что вы используете правильно Синхронизировано. Занятия в java.util.concurrent.atomic are неплохо, если у вас общее состояние вам нужно обновить (например, если вы хотите. иметь счетчик на сколько задач которые вы обработали).
  • Обычно вы хотите только столько. потоки, выполняющиеся как есть ядра /Кпюс на твоей машине./ Часто производительность часто повышается, когда количество нитей уменьшается. Обычно вы используете больше потоков только в том случае, если ваши задания тратят много времени заблокировано.
4
ответ дан 4 December 2019 в 08:15
поделиться

Вместо того, чтобы запускать новый поток для выполнения новой задачи, гораздо лучше:

  • иметь очередь задач для выполнения (вместо потоков для выполнения)
  • использовать меньший пул потоков (как упоминал Михаил) для обработки этих задач.

Разница в скорости и памяти огромна, потому что не нужно запускать и останавливать поток для каждой задачи.

Пакет java.util.concurrent объясняет все об этом. Книгу было бы проще прочитать, хотя :-(

).
2
ответ дан 4 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: