Java Concurrency: Count Zeichen von String

stimmen
1

während einige Java Praxis zu tun, kam ich auf eine Aufgabe mit Multithreading und Gleichzeitigkeit. Ich habe absolut keine Erfahrung mit , dass bisher. Die Stiftung ist ein Java - Klasse / Programm, das eine Funktion hat , um Zeichen in einem String zu zählen. Die Funktion wird mit der Zeichenkette und eine ConcurrentHashMap mit dem Alphabet in Kleinbuchstabe (char jeweils als Schlüssel) und das Auftreten eines jeden char als Wert (als Ganzzahl) vorgesehen. Das Programm arbeitet (mit HashMap und kein Multithreading, das heißt ohne runnable Umsetzung und ohne public void run).

Ich verstehe die Verwendung von ConcurrentHashMap um Multithreading zu ermöglichen und damit umgesetzt ConcurrentHashMap (es statt HashMap verwenden). Außerdem weiß ich, dass meine Klasse runnable implementieren muss und somit eine public void run () Methode hat.

Mein Ziel:

Ich würde gerne wissen, wie drei Threads zu starten, die alle den Charakter der Vorkommen des gleichen String zählen und in die ConcurrentHashMap schreiben.

Bin ich richtig nutzt, dass man diese Art der Implementierung schneller das Programm zum Laufen zu bringen? (antwortete)

Weitere Informationen

Wie aus den Antworten zu verstehen, ist es nicht klar, warum man dies tun würde. Es ist eine Praxis Aufgabe. Später könnte ich Datei-Eingabe von großen Text-Dateien (oder auch nicht, es Praxis ist, weiß ich nicht) hinzufügen.

Endbearbeitung

So ist es nicht sinnvoll, zu diesem Zweck Multithreading zu tun. Keine weiteren Antworten benötigt.

Mein-Code so weit:

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() {

    }
}
Veröffentlicht am 20/10/2018 um 12:33
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
3

Die einzige Frage, die ich in Ihrer Frage sah:

Bin ich richtig nutzt, dass man diese Art der Implementierung schneller das Programm zum Laufen zu bringen?

Nein, nicht in diesem Fall. Sie müssen verstehen , dass die Erstellung und Start-Threads und dann synchronisieren sie irgendwie Rennbedingungen zu vermeiden (zu korrigieren, deterministisches Verhalten zu erreichen) kostenlos nicht kommt.

Themen sind Ressourcen des zugrunde liegenden Betriebssystem. Es braucht Zeit , um zu erstellen, starten, verwalten sie.

Deshalb: mit mehreren Threads nicht automatisch übersetzen in „mein Programm läuft schneller“. Mehrere Threads nur Dinge machen „schneller“ , wenn der Vorteil der Verarbeitung von Daten in parallelen Gewinnen mehr als die anfänglich Kosten für diese Themen zu schaffen. Und natürlich müssen Sie auch Hardware in der Lage Threads parallel laufen zu lassen. Wenn Ihre Hardware nur ein Thread zu einem Zeitpunkt zu laufen wäre in der Lage, dann Sachen zu tun , die nur die CPU nutzt (und nie warten auf einen externen Eingang) , dann würden mehrere Threads, die immer langsamer.

Jetzt ist Ihre Aufgabe, die Zeichen in einer kurzen Zeichenfolge zu zählen, durch einen menschlichen Benutzer zur Verfügung gestellt. Dies wird am schnellsten von einem einzigen Thread Iterieren die Zeichenfolge gelöst, und tut seine Arbeit. Also: am wahrscheinlichsten, Ihre multi-threaded Programm wird ziemlich viel langsamer im Vergleich zu einem gerade nach vorne Single-Threaded-Lösung.

Wenn auf der anderen Seite würde Ihre Aufgabe Tausende von Dateien zu lesen sein, mit Millionen von Textzeilen, zum Beispiel einer Art Index für eine Volltextsuche zu bauen, dann natürlich: mehrere Threads verwendet werden kann dramatisch Gesamtausführung beschleunigen Zeit.

Darüber hinaus: der Code, den Sie bisher geschrieben haben, tut nichts. Um ein vernünftiges Programm machen Sie müssten:

  • einige Codes in diesem hat run()Methode.
  • um dann mehrere Threads zu erstellen , die diese aufrufen run()Verfahren parallel

Natürlich, das auch erfordert , dass Sie angemessene Partition Ihre Daten. Zum Beispiel könnten Sie jeden Thread einen bestimmten zählen haben Sub - String Ihrer Eingabe.

Beantwortet am 20/10/2018 um 12:41
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more