Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在hashmap中为lambda使用单独的线程来处理Runnable的竞争条件_Java_Multithreading_Lambda_Hashmap - Fatal编程技术网

Java 如何在hashmap中为lambda使用单独的线程来处理Runnable的竞争条件

Java 如何在hashmap中为lambda使用单独的线程来处理Runnable的竞争条件,java,multithreading,lambda,hashmap,Java,Multithreading,Lambda,Hashmap,我的软件导师(一名C#程序员)对我的代码进行了审查。他建议我在应用程序中使用lambda,以避免使用大量if/else-if语句。我用两种类型创建了一个hashmapString和Runnable 他说看起来不错,但现在我们遇到了一个问题,那就是比赛条件。。。这意味着Runnable是创建一个单独的线程,如果Runnable.run()thread没有赢得这场竞赛,它可能会导致后续问题(尤其是在构造函数中) 下面是显示问题的示例代码 import java.util.HashMap; impor

我的软件导师(一名C#程序员)对我的代码进行了审查。他建议我在应用程序中使用lambda,以避免使用大量
if/else-if
语句。我用两种类型创建了一个hashmap
String
Runnable

他说看起来不错,但现在我们遇到了一个问题,那就是比赛条件。。。这意味着Runnable是创建一个单独的线程,如果
Runnable.run()
thread没有赢得这场竞赛,它可能会导致后续问题(尤其是在构造函数中)

下面是显示问题的示例代码

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");
    }
}
import java.util.HashMap;
导入java.util.Map;
公共类testLambda{
字符串[]numArray={“一”、“二”、“三”};
testLambda(字符串数){
Map printNumber=新的HashMap();
put(numArray[0],()->printStringOne());
put(numArray[1],()->printStringTwo());
put(numaray[2],()->printStringThree());
printNumbers.get(num.run();
}
私有void printStringOne(){
系统输出打印项次(“1”);
}
私有void printStringTwo(){
系统输出打印项次(“2”);
}
私有void printStringThree(){
系统输出打印项次(“3”);
}
公共静态void main(字符串[]args){
新testLambda(“三”);
新的testLambda(“两个”);
新testLambda(“一”);
}
}
有两种解决方案,我不确定如何处理它们中的任何一种

  • 以某种方式保持当前线程,直到可运行线程完成执行,并在执行完成后使用某种类型的
    join
    ,让当前线程继续运行

  • 与其使用Runnable来执行lambda void类型表达式,不如在执行void类型lambda时使用其他方法


有人有什么想法吗?

没有竞争条件,因为所有可运行程序都在主线程上执行。如果您使用像这样的
新线程(printNumbers.get(num)).start()
并且您的方法正在访问同一个对象,则会出现竞争条件。我知道,您的右侧>。谢谢,我对此的担心已经结束:)没有竞争条件,因为所有可运行程序都在主线程上执行。如果您使用像这样的
新线程(printNumbers.get(num)).start()
并且您的方法正在访问同一个对象,则会出现竞争条件。我知道,您的右侧>。谢谢,我对此的担忧已经结束:)