我从我的软件导师(他是C#程序员)那里获得了代码审查。他建议我在我的应用程序中使用lambda来避免使用大量的if/else if
语句链。我创建了一个包含String
和Runnable
两种类型的哈希映射。
他说它看起来不错,但是现在我们遇到了一个存在竞争条件的问题...意味着Runnable正在创建一个单独的线程,如果Runnable.run()
线程没有赢得比赛,它可能会导致问题在线下(特别是在构造函数中)。
以下是显示问题的示例代码......
import java.util.HashMap;
import java.util.Map;
public class testLambda {
String[] numArray = {"One", "Two", "Three"};
testLambda(String num){
Map<String, Runnable> printNumbers = new HashMap<>();
printNumbers.put(numArray[0], () -> printStringOne());
printNumbers.put(numArray[1], () -> printStringTwo());
printNumbers.put(numArray[2], () -> printStringThree());
printNumbers.get(num).run();
}
private void printStringOne(){
System.out.println("1");
}
private void printStringTwo(){
System.out.println("2");
}
private void printStringThree(){
System.out.println("3");
}
public static void main(String[] args) {
new testLambda("Three");
new testLambda("Two");
new testLambda("One");
}
}
有几种解决方案,我不确定要处理其中任何一种......
以某种方式暂停当前线程,直到Runnable线程完成执行,并在完成后使用某种类型的join
让当前线程继续运行。
不使用Runnable执行lambda void类型表达式,而是以某种方式使用其他地方执行void类型lambda。
有人有什么想法吗?