Java Threading - альтернатива порождению огромного количества потоков - PullRequest
0 голосов
/ 06 декабря 2011

В настоящее время я создаю симуляционную программу для симуляции клиентов, перемещающихся по карте многопользовательской онлайн-игры. Я должен иметь сетку для представления карты, которая содержит объекты клиента. Эти клиенты должны перемещаться по сетке случайным образом, каждый из которых взаимодействует с объектом сервера.

В данный момент я запускаю новый поток для каждого клиента, и он вызывает на своем сервере метод со случайным направлением движения каждую секунду.

Это работает нормально, пока я не начну добавлять огромное количество клиентов (~ 5000), где происходит сбой программы, и я получаю исключение "java.lang.OutOfMemoryError: не в состоянии создать новый собственный поток".

Есть ли альтернативный способ справиться с таким большим количеством клиентов, каждый из которых не является отдельным потоком?

Спасибо, Дэн

Ответы [ 3 ]

4 голосов
/ 07 декабря 2011

С какой стати вы даете каждому клиенту свою нить? Просто попросите одну нить сделать следующее:

for (;;) {
    for (Client c : clients) {
        c.update();
    }
    Thread.sleep(1000);
}

Преимущество заключается в том, что справедливость гарантируется (все клиенты обновляются, даже если система перегружена), и сервер не должен быть поточно-ориентированным. Более того, цикл for гораздо эффективнее переключения потоков, он потребляет меньше памяти (каждому потоку выделен стек).

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

Рассматривали ли вы для этого модель параллелизма актера? Akka предоставляет зрелую библиотечную реализацию актера для этого. Это позволяет создавать огромное количество объектов, которые могут общаться друг с другом с помощью передачи сообщений. Он поддерживается пулом потоков.

http://akka.io/docs/akka/1.2/java/untyped-actors.html

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

Есть два способа думать о макушке головы.

1 - каждый поток содержит коллекцию клиентов.

Вместо 1 клиента на поток. Попробуйте иметь коллекцию X клиентов на поток. Затем выполните цикл по клиентам, перемещающим каждого из них.

2 - верно распространяйте своих клиентов

Используйте JMeter или другой комплект распределенного тестирования для распределения потоков по нескольким компьютерам.

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