从多线程获取相同方法的结果

时间:2016-06-18 14:08:56

标签: multithreading

我想快速并行化我的程序,所以我的程序是这样的:

  Sim1 sim1 = new Sim1();
    for(Entry<Integer, HashSet<String>> entry : map_topics_words.entrySet()) {              
                Integer k = entry.getKey();
                Double sim = sim1.prob(word_m, entry.getValue());           
                sim_avg.put(k, sim);
                score += sim;           
} 

和类Sim1中的方法中的概率

public double prob(String w_i, HashSet<String> set_i){  
    Similarity sim = new Similarity();
    double score = 1;
    Iterator<String> it = set_i.iterator();
    while (it.hasNext()) {
        score += sim.computeSim(w_i, it.next());            
    }
    score = score/set_i.size(); 
    return score;
}

和computeSim在classe中的方法相似:

public double computeSim(String w_1, String w_2){   
return  cmp(w_1,w_2);
}

所以我想使用线程作为第一种方法和第二种方法的线程,我尝试了不同的方法,但我失败了 请帮忙 谢谢

1 个答案:

答案 0 :(得分:0)

您可以更改第一个方法代码,如下所示。我们可以通过将prob()方法的工作作为Callable任务提交来使用Executor框架来尝试这个,这样它就可以在不同的线程中执行,然后使用Future我们可以得到结果特别要求,我们需要再保留一个关键字和相应Future对象的地图,请参阅下面的代码以便更好地理解它,希望它可以帮到你。

        Sim1 sim1 = new Sim1();
        Map<Integer, Future<Double>> workerMap = new HashMap<>();
        ExecutorService exe = Executors.newCachedThreadPool();

        for(Map.Entry<Integer, HashSet<String>> entry : map_topics_words.entrySet()) {
            Integer k = entry.getKey();
            workerMap.put(k, exe.submit(()->{    //Java 8 lamda
                return sim1.prob(word_m, entry.getValue());
            }));
        }

    //This loop is to get the result of prob() method for all the keys and process them further

       for(Map.Entry<Integer, HashSet<String>> entry : map_topics_words.entrySet()) {
            Integer k = entry.getKey();
            try {
                Double sim = workerMap.get(k).get();
                sim_avg.put(k, sim);
                score += sim;
            } catch (Exception e) {
                e.printStackTrace();
            }
        } 

我建议你在java中google Callable和Future的工作,你也可以看到这个link