Я пишу optimazation алгоритм, который создает приблизительно 100 потоков. В настоящее время я запускаю их все сразу (для цикла), и после этого я говорю каждому потоку, что он должен присоединиться ().
Моя проблема состоит в том теперь, когда каждый поток использует для большой памяти, таким образом, исключение пространства "кучи" не займет много времени. Я хочу некоторое планирование, но не знаю, как реализовать его.
Я имею что-то вроде этого в виду: запустите 10 потоков и каждый раз, когда один из этих концов запускает новый. Так, чтобы там всегда выполнили 10 потоков за один раз, пока никакой поток не оставляют.
Кто-то имеет идею или знает, как понять что-то вроде этого?
Большое спасибо и отношения из Кельна
Marco
Рассмотрим количество ядер в используемой машине. Лучше всего, если количество выполняемых потоков будет равно количеству ядер. Как говорит KLE, используйте пул потоков
.Используйте ThreadPoolExecutor с соответствующим максимальным размером пула.
.Вот пример для начала. Сначала, что нужно импортировать:
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");
}
Некоторые заметки о вышеперечисленном:
java.util.concurrent.atomic
are
неплохо, если у вас общее состояние
вам нужно обновить (например, если вы хотите.
иметь счетчик на сколько задач
которые вы обработали). Вместо того, чтобы запускать новый поток для выполнения новой задачи, гораздо лучше:
Разница в скорости и памяти огромна, потому что не нужно запускать и останавливать поток для каждой задачи.
Пакет java.util.concurrent объясняет все об этом. Книгу было бы проще прочитать, хотя :-(
).