Многопоточность - PullRequest
       1

Многопоточность

0 голосов
/ 03 декабря 2011

У меня есть Java-приложение, которое запускает потоки для выполнения некоторой работы по N раз для каждого потока, и может быть настроено количество потоков. Каждая итерация задания для каждого потока занимает от 20 секунд до 1-1,5 минут. Каждый поток должен выполнить около 25000-100000 итераций для этой работы. Таким образом, ранее добавленные задания имеют больше «выполненных заданий» и имеют более высокий приоритет (как я думаю для JVM, но приоритет не настроен, и они имеют равный приоритет программно). Но мне нужны потоки, чтобы делать работу равномерно после добавления некоторых новых задач. Например, есть 5000 потоков для выполнения 100 заданий за 100000 итераций:

  • Старая работа # 1 делает это
  • Старая работа # 2 делает это
  • ...
  • Старая работа # 100 делает это

Но когда я добавлю, например, задание № 101, я увижу, что потоки запускают его не так быстро, как первые задания. Я использовал yield () и sleep (50), но это не очень хорошие результаты. Не могли бы вы сказать мне, что я делаю неправильно и как добиться превосходной производительности для слишком большого количества потоков?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Потоки запланированы планировщиком ОС, и вы не можете ожидать, что они будут выполняться в фиксированном порядке, как это. Только у каждого потока должно быть определенное время от планировщика. Если задачи не зависят от других, вы все равно не должны заботиться о заказе. Если они не независимы, вы должны заставить их сотрудничать, чтобы убедиться, что все выполняется в соответствующем порядке.

Наличие 5000 потоков, вероятно, слишком много. Сколько процессоров у вашей машины? Какие задачи выполняются потоками. Если они связаны с процессором, лучше всего иметь количество потоков, равное количеству процессоров или числу процессоров + 1.

1 голос
/ 03 декабря 2011

Трудно сказать вам, что вы делаете неправильно (если вообще что-то), потому что вы ничего не сказали нам о том, как именно это реализовали.

Возможно, вы захотите использовать ExecutorService (пул потоков), который может автоматически распределять для вас задания по нескольким потокам. См. Интерфейсы исполнителя из Oracle Tutorials.

Вы ничего не сказали нам о том, что делает программа, но, возможно, Java 7 Fork / Join Framework может быть полезным, если проблема подходит для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...