Java Συνδρομικότητα: Μετρήστε χαρακτήρες της συμβολοσειράς

ψήφοι
1

ενώ κάνει κάποια πρακτική Java, ήρθα σε μια εργασία, συμπεριλαμβανομένων multithreading και συγχρονισμός. Δεν έχω απολύτως καμία εμπειρία με αυτό μέχρι στιγμής. Το ίδρυμα είναι μια κλάση Java / πρόγραμμα, το οποίο έχει μια λειτουργία για να μετρήσει χαρακτήρες σε μια σειρά. Η λειτουργία είναι εφοδιασμένο με τη συμβολοσειρά και ένα ConcurrentHashMap με αλφαβήτου σε πεζά (έκαστο απανθρακώματος ως κλειδί) και την εμφάνιση του κάθε char ως τιμή (όπως ακέραιος αριθμός). Το πρόγραμμα λειτουργεί (με HashMap και χωρίς multithreading, που σημαίνει ότι χωρίς την εφαρμογή εκτελέσιμη και χωρίς τη δημόσια άκυρη εκτέλεσης).

Καταλαβαίνω τη χρήση των ConcurrentHashMap προκειμένου να καταστεί δυνατή multithreading και να εφαρμοστεί έτσι ConcurrentHashMap (χρησιμοποιώντας αντί για HashMap). Επίσης ξέρω ότι τάξη μου πρέπει να εφαρμόσει εκτελέσιμη, και ως εκ τούτου έχει μια μέθοδο public void run ().

Ο στόχος μου:

Θα ήθελα να ξέρω, πώς να ξεκινήσετε τρία θέματα, τα οποία όλα μετράνε εμφανίσεις του χαρακτήρα του ίδιου String και να το γράψετε στο ConcurrentHashMap.

Έχω δίκιο, ότι ένας χρησιμοποιεί αυτό το είδος της εφαρμογής για να κάνει το πρόγραμμα τρέχει πιο γρήγορα; (Απάντηση)

Περαιτέρω πληροφορίες

Όπως γίνεται αντιληπτό από τις απαντήσεις, δεν είναι σαφές, γιατί κάποιος θα το κάνετε αυτό. Πρόκειται για ένα έργο πρακτική. Αργότερα, θα ήθελα να προσθέσω το αρχείο εισόδου του μεγάλου κειμένου αρχεία (ή μπορεί και όχι, δεν είναι πρακτική, δεν ξέρω).

τελική επεξεργασία

Έτσι, δεν είναι χρήσιμο για το σκοπό αυτό να κάνει multithreading. Καμία περαιτέρω απαντήσεις που χρειάζεται.

Κωδικός μου μέχρι τώρα:

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

    }
}
Δημοσιεύθηκε 20/10/2018 στις 12:33
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
3

Το ένα ερώτημα που είδα στην ερώτησή σας:

Έχω δίκιο, ότι ένας χρησιμοποιεί αυτό το είδος της εφαρμογής για να κάνει το πρόγραμμα τρέχει πιο γρήγορα;

Όχι, δεν είναι σε αυτήν την περίπτωση. Πρέπει να καταλάβετε ότι η δημιουργία και την έναρξη θέματα, και στη συνέχεια το συγχρονισμό τους με κάποιο τρόπο να αποφευχθούν συνθήκες του αγώνα (για να επιτευχθεί σωστή, ντετερμινιστική συμπεριφορά) δεν έρχεται δωρεάν.

Νήματα είναι οι πόροι του υποκείμενου λειτουργικού συστήματος. Χρειάζεται χρόνο για να δημιουργήσει, να ξεκινήσει, να διαχειρίζονται τους.

Ως εκ τούτου: χρησιμοποιώντας πολλαπλά threads δεν μεταφράζεται αυτόματα σε «το πρόγραμμά μου τρέχει πιο γρήγορα». Πολλαπλά τα θέματα που κάνει τα πράγματα «πιο γρήγορα», όταν το πλεονέκτημα της επεξεργασίας δεδομένων παράλληλα κέρδη πάνω από το αρχικό κόστος για τη δημιουργία αυτών των νημάτων. Και φυσικά, θα πρέπει επίσης το υλικό είναι σε θέση να τρέξει τα θέματα που παράλληλα. Αν το υλικό σας θα είναι σε θέση να τρέξει μόνο ένα νήμα σε χρόνο, στη συνέχεια, να κάνει πράγματα που χρησιμοποιεί μόνο τη CPU (και ποτέ δεν περιμένει κάποια εξωτερική είσοδο) στη συνέχεια, έχοντας πολλαπλά threads θα είναι πάντα να είναι πιο αργή.

Τώρα, ο στόχος σας είναι να μετρήσετε τους χαρακτήρες σε ένα σύντομο εγχόρδων, που παρέχεται από έναν ανθρώπινο χρήστη. Αυτό είναι πιο γρήγορα λύνεται με ένα μόνο νήμα επανάληψη το string, και να κάνει το έργο της. Έτσι: κατά πάσα πιθανότητα, πολυ σπείρωμα πρόγραμμά σας θα είναι λίγο πιο αργό αρκετά σε σύγκριση με μια ευθεία προς τα εμπρός και μόνο με σπείρωμα λύση.

Εάν, από την άλλη πλευρά το καθήκον σας θα είναι να διαβάσει χιλιάδες αρχεία, με τα εκατομμύρια των γραμμών του κειμένου, για παράδειγμα, για την κατασκευή κάποιου είδους ευρετήριο αναζήτησης πλήρους κειμένου, τότε φυσικά: χρησιμοποιώντας πολλαπλά threads μπορεί εντυπωσιακά να επιταχύνει τη συνολική εκτέλεση χρόνος.

Από εκεί και πέρα: ο κώδικας που έχετε γράψει κάνει μέχρι τώρα τίποτα. Για να κάνετε ένα λογικό πρόγραμμα που θα πρέπει να:

  • έχουν κάποια κώδικα σε αυτή run()τη μέθοδο.
  • να στη συνέχεια να δημιουργήσετε πολλαπλά νήματα που επικαλούνται ότι run()μέθοδος παράλληλα

Φυσικά, αυτό επίσης απαιτεί από εσάς να λογική κατάτμηση των δεδομένων σας. Για παράδειγμα, θα μπορούσατε να έχετε κάθε νήμα μετράνε ένα συγκεκριμένο υπο συμβολοσειρά εισόδου σας.

Απαντήθηκε 20/10/2018 στις 12:41
πηγή χρήστη

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