代码之家  ›  专栏  ›  技术社区  ›  Shushiro

Java并发:计算字符串的字符数

  •  1
  • Shushiro  · 技术社区  · 7 年前

    在进行一些Java实践时,我遇到了一个包括多线程和并发的任务。我有 绝对没有经验 到目前为止。该基础是java类/程序,它具有对字符串中的字符进行计数的功能。函数提供了字符串和ConcurrentHashMap,小写字母表(每个字符作为键)和出现的每个字符作为值(作为整数)。该程序可以工作(使用Hashmap,没有多线程,也就是说没有实现runnable,也没有public void run)。

    我了解ConcurrentHashMap的用法,以便启用多线程,从而实现ConcurrentHashMap(使用它而不是HashMap)。此外,我知道我的类需要实现runnable,因此有一个publicvoidrun()方法。

    我的目标:

    我想知道,如何启动三个线程,它们都计算同一字符串中字符的出现次数,并将其写入ConcurrentHashMap。

    我说的对吗,那一个利用这种实现使程序运行得更快(回答)

    更多信息

    从答案中可以理解,不清楚为什么要这样做。这是一项实践任务。以后,我可能会添加文件输入的大文本文件(也可能不会,这是实践,我不知道)。

    最终编辑

    因此,这样做并不有用,即多线程。不需要进一步的回答。

    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    class WordCounter implements Runnable {
    
        // method to count characters in given string
        static void characterCount(String inputString, ConcurrentHashMap<Character, Integer> charCountMap) {
            // Converting String to lowercase
            inputString = inputString.toLowerCase();
    
            // Converting given string to char array
            char[] strArray = inputString.toCharArray();
    
                // checking each char of strArray
                for (char c : strArray) {
                    if (charCountMap.containsKey(c)) {
                        // If char is present in charCountMap,
                        // incrementing it's count by 1
                        charCountMap.put(c, charCountMap.get(c) + 1);
                    }
                }
    
                // Printing the charCountMap
                for (Map.Entry entry : charCountMap.entrySet()) {
                    if(!entry.getValue().equals(0)){
                    System.out.println(entry.getKey() + " " + entry.getValue());
                }}
    
        }
    
    
        // Main
        public static void main(String[] args)
        {
            // Creating a HashMap containing alphabet in lower case
            // as a key and occurrences as  a value (initialized with value: 0)
            ConcurrentHashMap<Character, Integer> charCountMap
                    = new ConcurrentHashMap<>();
            for (char ch = 'a'; ch <= 'z'; ++ch)
                charCountMap.put(ch, 0);
    
            String str = "GGACACGTagGcGT";
            characterCount(str, charCountMap);
        }
    
        @Override
        public void run() {
    
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   GhostCat    7 年前

    我在你的问题中看到一个问题:

    我说的对吗,那一个利用这种实现使程序运行得更快?

    不,这种情况下不行。您必须了解创建和启动线程,然后 他们以某种方式来避免种族条件(实现正确的,确定性的行为)不是免费的。

    线程是底层操作系统的资源。它需要 时间

    因此:使用多线程不会自动转换为“我的程序运行得更快”。当并行处理数据的优势大于创建这些线程的初始成本时,多线程只会使事情变得“更快”。当然,您还需要能够并行运行线程的硬件。 如果 你的硬件一次只能运行一个线程,然后做一些只使用CPU的事情(从不等待外部输入),然后有多个线程就可以了 总是

    现在,您的任务是计算由用户提供的短字符串中的字符数。这可以通过单个线程迭代字符串并执行其工作来最快速地解决。因此:与直接的单线程解决方案相比,您的多线程程序很可能会慢一些。

    另一方面,如果您的任务是读取数千个文件,其中包含数百万行文本,例如为全文搜索建立某种索引,那么当然:使用多个线程可以显著加快总体执行时间。

    • 有密码吗 run() 方法。
    • 然后创建多个线程来调用 并行方法

    当然,那个 要求你讲道理 隔板 你的数据。例如,可以让每个线程都有一个特定的计数 你的意见。