我想快速并行化我的程序,所以我的程序是这样的:
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);
}
所以我想使用线程作为第一种方法和第二种方法的线程,我尝试了不同的方法,但我失败了 请帮忙 谢谢
答案 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。