Параллелизм Java: подсчет символов строки - PullRequest
0 голосов
/ 20 октября 2018

, занимаясь практикой Java, я столкнулся с задачей, включающей многопоточность и параллелизм.У меня абсолютно нет опыта с этим до сих пор.Основой является класс / программа Java, в которой есть функция для подсчета символов в строке.Функция снабжена строкой и ConcurrentHashMap с алфавитом в нижнем регистре (каждый символ в качестве ключа) и вхождением каждого символа в качестве значения (в виде целого числа).Программа работает (с Hashmap и без многопоточности, то есть без реализации runnable и без публичного запуска void).

Я понимаю использование ConcurrentHashMap для включения многопоточности и, таким образом, реализовал ConcurrentHashMap (используя его вместо HashMap).Кроме того, я знаю, что мой класс должен реализовывать runnable, и поэтому у него есть открытый метод void run ().

Моя цель:

Я хотел бы знать, как запустить три потока, которые все считают количество символов в одной и той же строке и записывают ее в 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 Ответ

0 голосов
/ 20 октября 2018

Один вопрос, который я увидел в вашем вопросе:

Прав ли я, что кто-то использует такую ​​реализацию для ускорения работы программы?

Нет,не в этом дело.Вы должны понимать, что создание и запуск потоков, а затем их синхронизация так или иначе, чтобы избежать условий гонки (для достижения правильного, детерминированного поведения), не бесплатны.

Потоки - это ресурсыбазовая операционная система.Для их создания, запуска, управления ими требуется время .

Поэтому: использование нескольких потоков автоматически не переводится в "моя программа работает быстрее".Несколько потоков только ускоряют процесс, когда преимущество параллельной обработки данных получает больше, чем первоначальная стоимость создания этих потоков.И, конечно же, вам также необходимо оборудование, способное выполнять потоки параллельно. Если ваше оборудование сможет запускать только один поток за раз, то выполнение вещи, которая использует только ЦП (и никогда не ожидает некоторого внешнего ввода), тогда наличие нескольких потоков всегда будетпомедленнее.

Теперь ваша задача - подсчитать символы в короткой строке, предоставленной пользователем.Это быстрее всего решается одним потоком, повторяющим строку и выполняющим свою работу.Таким образом: скорее всего, ваша многопоточная программа будет немного медленнее по сравнению с простым однопоточным решением.

Если, с другой стороны, ваша задача будет читать тысячи файлов с миллионами строктекста, например, для создания своего рода индекса для полнотекстового поиска, тогда, конечно: использование нескольких потоков может значительно ускорить общее время выполнения.

Помимо этого: код, который вы написали до сих пор, ничего не делает,Чтобы создать разумную программу, вам необходимо:

  • иметь некоторый код в этом методе run().
  • , чтобы затем создать несколько потоков, которые будут вызывать этот метод run() параллельно

Разумеется, что также требует от вас разумного разбиения ваших данных.Например, каждый поток может подсчитать определенную подстроку вашего ввода.

...