我在处理我的 java 代码时遇到问题。
我确信我已经使用了我在网上找到的所有推荐。但还是不行。
import java.util.*;
import java.util.concurrent.*;
import java.util.Map;
public class GradeCounterImpl implements GradeCounter {
ConcurrentHashMap<String, GradeCount> save;
public GradeCount[] count(String[] grades, int nThreads) {
if (grades == null) {
return new GradeCount[0];
}
if (grades.length == 0) {
return new GradeCount[0];
}
save = new ConcurrentHashMap<>();
class WorkUnit implements Runnable {
final String[] positions;
public WorkUnit(String[] i) {
this.positions = i;
}
public void run() {
for (String pos : positions)
if (pos != null) {
if (save.containsKey(pos)) {
save.get(pos).count++;
} else {
save.put(pos, new GradeCount(pos, 1));
}
}
}
}
int divide = (grades.length / nThreads);
ExecutorService exe = Executors.newFixedThreadPool(nThreads);
for (int i = 0; i < nThreads; i++)
exe.execute(new WorkUnit(arrayBetween(i * divide, (i + 1) * divide, grades)));
exe.shutdown();
try {
exe.awaitTermination(30, TimeUnit.MINUTES);
} catch (InterruptedException error) {
error.printStackTrace();
}
Collection<GradeCount> c = save.values();
return c.toArray(new GradeCount[c.size()]);
}
private String[] arrayBetween(int start, int end, String[] target) {
String[] ans = new String[end - start];
for (int i = start; i < end; i++)
if (i < target.length)
ans[i - start] = target[i];
return ans;
}
}
public class GradeCount implements Comparable<GradeCount> {
public String grade;
public int count;
public GradeCount(final String grade, final int count) {
this.grade = grade;
this.count = count;
}
public int compareTo(final GradeCount other) {
final int gradeCmp = this.grade.compareTo(other.grade);
return gradeCmp == 0 ? Integer.compare(this.count, other.count) : gradeCmp;
}
}
它要做什么?
代码必须计算 Grades 数组中出现的每个字符串,并将结果保存在 HashMap 中,然后返回它们的值。
有什么问题吗?
该代码(正如您可以通过标题来留言的那样)无法正常工作。它不算很好,而且我在大数组测试之间存在巨大差异。
观察结果:
当我使用小数组(0 - 50 个值)进行测试时,程序运行良好
现在:我应该做什么?
感谢您阅读本文,希望您能帮助我。
最佳答案
问题出在这里:
if (save.containsKey(pos)) {
save.get(pos).count++;
} else {
save.put(pos, new GradeCount(pos, 1));
}
您有一个ConcurrentHashMap
但您的 GradeCounter 未同步,因此请调用 count++
不会更正
我认为你的GradeCount
看起来像 {grade, count}
所以我建议你使用Map<String, AtomicInteger>
相反
关于Java 线程(初学者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50310809/