Java 线程(初学者)

标签 java

我在处理我的 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/

相关文章:

Java 将 4 个字节转换为 int

java - primefaces 可以与facelets 一起使用吗?

java - Netbeans Jar 文件未执行

java - 使用相同参数的多个方法的设计模式

java - 使用 java 替换特定模式前面出现的所有字符串

java - 如何关闭断开的jdbc连接?

java - 在 Java 中将非常大的数据输出到标准输出的最快方法

java - python中的元类==java中的接口(interface)?

java - Java访问windows计划任务

java - 在 TextView 文本之间添加两个空格