如何使用Runnable处理竞争条件,使用单独的线程为lambda内部的hashmap

时间:2017-05-16 04:08:37

标签: java multithreading lambda hashmap

我从我的软件导师(他是C#程序员)那里获得了代码审查。他建议我在我的应用程序中使用lambda来避免使用大量的if/else if语句链。我创建了一个包含StringRunnable两种类型的哈希映射。

他说它看起来不错,但是现在我们遇到了一个存在竞争条件的问题...意味着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。

有人有什么想法吗?

0 个答案:

没有答案