簡體   English   中英

Java Concurrency:計算String的字符數

[英]Java Concurrency: Count characters of String

在做一些Java實踐時,我遇到了包括多線程和並發在內的任務。 到目前為止,我完全沒有經驗 該基礎是一個java類/程序,它具有計算字符串中字符的功能。 該函數提供了字符串和ConcurrentHashMap,字母為小寫(每個字符為鍵),每個字符的出現為值(整數)。 該程序工作(使用Hashmap並且沒有多線程,這意味着沒有實現runnable並且沒有公共void運行)。

我理解ConcurrentHashMap的用法,以便啟用多線程,從而實現ConcurrentHashMap(使用它而不是HashMap)。 此外我知道,我的類需要實現runnable,因此有一個public void run()方法。

我的目標:

我想知道,如何啟動三個線程,它們都計算相同String的字符出現並將其寫入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() {

    }
}

我在你的問題中看到的一個問題:

我是對的,那個利用這種實現來使程序運行得更快?

不,不是在這種情況下。 您必須了解創建和啟動線程,然后以某種方式同步它們以避免競爭條件(實現正確的,確定性的行為)並非免費。

線程是底層操作系統的資源。 創建,啟動和管理它們需要時間

因此:使用多個線程不會自動轉換為“我的程序運行速度更快”。 當並行處理數據的優勢超過創建這些線程的初始成本時,多線程只會使事情“更快”。 當然,您還需要能夠並行運行線程的硬件。 如果你的硬件一次只能運行一個線程,那么做只使用CPU的東西(永遠不會等待一些外部輸入),那么擁有多個線程總是會慢一些。

現在,您的任務是計算由人類用戶提供的短字符串中的字符。 通過迭代字符串並完成其工作的單個線程可以最快地解決這個問題。 因此:與直接單線程解決方案相比,您的多線程程序很可能會慢得多。

另一方面,如果您的任務是讀取數千個文件,包含數百萬行文本,例如為全文搜索構建某種索引,那么當然:使用多個線程可以大大加快整體執行速度時間。

除此之外:到目前為止你編寫的代碼什么也沒做。 要制定合理的計划,您需要:

  • run()方法中有一些代碼。
  • 然后創建多個並行調用run()方法的線程

當然,這要求您合理地划分數據。 例如,您可以讓每個線程計算輸入的特定子字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM