我正在制作一个游戏,并且有一个ConcurrentHashMap,其中包含当前登录的所有玩家.我有一个AutoSaver线程循环通过HashMap并将所有玩家1保存为1.当没有多少玩家时这很好,因为它迭代时间不会太长,但是当有很多玩家登录时它会慢一点.我使用java流和并行读取,我们可以加快集合的处理,所以我尝试将现有循环改为现在使用流和并行.
我的问题是,我的实施是否正确?有没有更好的方法呢?它现在是线程安全吗?
这是现有的实现
for(Player player : ActiveConnections.getAllConnectedPlayers().values(){
if(player != null)
saveManager.savePlayer(player, true);
}
Run Code Online (Sandbox Code Playgroud)
这是我使用流和并行的实现
ActiveConnections.getAllConnectedPlayers().values()
.stream()
.parallel()
.filter((x) -> x != null)
.forEach((x) -> saveManager.savePlayer(x, true));
Run Code Online (Sandbox Code Playgroud)
编辑 这是我的保存管理器实现
public class SaveManager {
private MySqlManager sqlManager;
public SaveManager(){
sqlManager = MySqlManager.getInstance();
}
public void savePlayer(Player player, boolean autoSave){
//Saves the player
}
Run Code Online (Sandbox Code Playgroud)
我刚刚开始使用lambdas,所以如果出现问题请告诉我.
有什么区别:
myModel.transform.SetToTranslation( *some Vector3* )
Run Code Online (Sandbox Code Playgroud)
和
myModel.transform.translate( *some Vector3* )
Run Code Online (Sandbox Code Playgroud)
(其中myModel的类型为ModelInstance)
具体来说,这些操作的副作用是什么?
对我来说最重要的是,您使用一种方法而不是另一种方法的典型用例是什么?
我正在阅读有关最终变量的信息,并了解到当您将参数作为最终参数时,您无法更改它。但后来我尝试了一些东西
编译器在这里抱怨说你不能改变我能理解的最终参数
public class FinalVariableTest {
public void method1(final FinalVariableTest object){
object = new FinalVariableTest(); //Not allowed, compiler complains
}
public void method2(FinalVariableTest object){
object = new FinalVariableTest();
}
public static void main(String[] args) {
FinalVariableTest test = new FinalVariableTest();
test.method1(test);
}
}
Run Code Online (Sandbox Code Playgroud)
但是编译器对此很好
public class FinalVariableTest {
public void method1(final FinalVariableTest object){
method2(object);
}
public void method2(FinalVariableTest object){
object = new FinalVariableTest(); //Compiler does not complain
}
public static void main(String[] args) {
FinalVariableTest test = new FinalVariableTest();
test.method1(test); …Run Code Online (Sandbox Code Playgroud)