Раньше я использовал HashMap, как
public Map<SocketChannel, UserProfile> clients = new HashMap<SocketChannel, UserProfile>();
, теперь я переключился на ConcurrentHashMap, чтобы избежать синхронизированных блоков, и теперь у меня возникают проблемы, когда мой сервер сильно загружен 200-400 одновременными клиентами, которыекак ожидается, со временем будет расти.
, который теперь выглядит следующим образом
public ConcurrentHashMap<SocketChannel, UserProfile> clients = new ConcurrentHashMap<SocketChannel, UserProfile>();
Мой дизайн сервера работает следующим образом.У меня есть рабочий поток (ы) для обработки огромного количества пакетов.Каждый пакет проверяется с помощью подпрограммы packetHandler (не являющейся частью потока), практически любой клиент может вызвать его в любое время, когда он почти статичен, но это не так.
Весь мой сервер в основном однопоточный, за исключениемчасть обработки пакетов.
В любом случае, когда кто-то использует такую команду, как подсчитать все клиенты в сети и получить от них некоторую информацию.
Также возможно, что клиенты могут быть отключены и удалены из ConcurrentHashMap во время подсчета (что вызывает мои проблемы).
Также я хотел бы добавить сюда немного кода.
int txtGirls=0;
int vidGirls=0;
int txtBoys=0;
int vidBoys=0;
Iterator i = clients.values().iterator();
while (i.hasNext()) {
UserProfile person = (UserProfile)i.next();
if(person != null) {
if(person.getChatType()) {
if(person.getGender().equals("m"))
vidBoys++;
else //<-- crash occurs here.
vidGirls++;
} else if(!person.getChatType()) {
if(person.getGender().equals("m"))
txtBoys++;
else
txtGirls++;
}
}
}
Я имею в виду, конечно, яЯ собираюсь исправить это, добавив исключение try-catch внутри Iterator, чтобы пропустить эти нулевые клиенты.
Но что я не понимаю, если он проверяет выше, если (person! = null) не долженВложенный код автоматически работает ..
, если это не означает, что он был удален во время итерации, что должно быть невозможно, так как это потокобезопасный wtf?
Что я должен делать?или try-catch Exception - лучший способ?
Вот исключение
java.lang.NullPointerException
at Server.processPackets(Server.java:398)
at PacketWorker.run(PacketWorker.java:43)
at java.lang.Thread.run(Thread.java:636)
processPackets содержит приведенный выше код.и комментарий указывает количество строк #
Спасибо за то, что просветили меня.