Tworzę grę i mam ConcurrentHashMap, która zawiera wszystkich graczy, którzy są obecnie zalogowani. Mam wątek AutoSaver, który wykonuje pętlę przez HashMap i zapisuje wszyscy gracze 1 przez 1. Jeśli nie ma wielu graczy, to jest w porządku, ponieważ nie zajmuje to zbyt wiele czasu, ale może nieco zwolnić, gdy zaloguje się wielu graczy. Czytam przy użyciu strumienia java i równolegle, możemy przyspieszyć przetwarzanie zbiorów, więc próbowałem zmienić istniejącą pętlę, aby teraz używać stream i równolegle.Zmiana istniejącej pętli foreach na ConcurrentHashMap w celu użycia Lambdas do wykorzystania przetwarzania równoległego
Moje pytanie brzmi, czy moja implementacja jest poprawna? Czy istnieje lepszy sposób na zrobienie tego? Czy teraz wątek jest bezpieczny?
Oto istniejące wdrożenie
for(Player player : ActiveConnections.getAllConnectedPlayers().values(){
if(player != null)
saveManager.savePlayer(player, true);
}
Tu jest moja realizacja przy użyciu strumienia i równolegle
ActiveConnections.getAllConnectedPlayers().values()
.stream()
.parallel()
.filter((x) -> x != null)
.forEach((x) -> saveManager.savePlayer(x, true));
EDIT Oto mój Zapisz realizacji menedżera
public class SaveManager {
private MySqlManager sqlManager;
public SaveManager(){
sqlManager = MySqlManager.getInstance();
}
public void savePlayer(Player player, boolean autoSave){
//Saves the player
}
zysk Właśnie zacząłem używać lambdas, więc daj mi znać, jeśli coś jest nie tak.
To mi odpowiada ... To pytanie może być lepiej dostosowane do [Przeglądu kodu] (http://codereview.stackexchange.com/). –
Nie miałem pojęcia, że istnieje jak przegląd kodu na przepełnieniu stosu. :) Przeniesię go, jeśli będzie to wymagane. – Sneh
Dokumentacja "ConcurrentHashMap" jasno stwierdza, że "[...] Podobnie jak Hashtable, ale w przeciwieństwie do HashMap, ta klasa nie pozwala na użycie wartości null jako klucza lub wartości." - dlaczego więc test na zero? – fge