Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Завдання: Виконавці | Механізми Синхронізації Високого Рівня
Багатопотоковість у Java

bookЗавдання: Виконавці

Завдання

Уявіть, що у вас є список файлів, кожен з яких містить рядки тексту. Ваше завдання — зчитувати рядки з цих файлів паралельно та підраховувати кількість слів у кожному рядку. Для виконання завдання використовуйте ExecutorService, Future та пул потоків.

Вимоги:

  • Створення пулу потоків: Створити пул потоків фіксованого розміру за допомогою Executors.newFixedThreadPool(int nThreads), де nThreads — кількість потоків у пулі;

  • Реалізація завдання: Реалізувати клас WordCountTask, який імплементує інтерфейс Callable<String> і приймає файл як вхідний параметр. У методі call цього класу зчитувати рядки з файлу, підраховувати кількість слів у кожному рядку та повертати результат;

  • Використання ExecutorService: За допомогою ExecutorService надсилати завдання до пулу потоків для виконання. Завдання мають використовувати клас WordCountTask.

Note
Примітка

Також рядок, який ви формуєте в окремому потоці, необхідно повернути та використати метод get() інтерфейсу Future, щоб отримати результат виконання потоку та вивести його у консоль у методі main.

Зчитування з файлу

Для реалізації call() можна використовувати BufferedReader для зчитування рядків з файлів. Використовуйте блок try-with-resources, щоб ресурси автоматично закривалися.

Main.java

Main.java

copy
1
BufferedReader reader = new BufferedReader(new FileReader(file));

Використовуйте метод readLine() для зчитування кожного рядка та обов'язково перевіряйте на null, щоб визначити, коли досягнуто кінця файлу.

Далі розділіть рядок на масив рядків за допомогою методу split("\\s+") з патерном \\s+, який розділяє рядок за пробілами, а потім отримайте розмір масиву.

У самому рядку, який повертає потік, використовуйте це форматування

Main.java

Main.java

copy
1
String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)

Файли вже знаходяться у проєкті, вам не потрібно їх створювати або змінювати!

Приклад виводу

File: file1.txt | Line: Hello | Word Count: 1

File: file2.txt | Line: Hello I Love Java | Word Count: 4
File: file2.txt | Line: Lol Hello | Word Count: 2

File: file3.txt | Line: Java so so so so very nice | Word Count: 7
Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 7

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Suggested prompts:

Can you show me how to implement the WordCountTask class?

How do I use ExecutorService to run the WordCountTask for multiple files?

Can you explain how to format the output for each line as shown in the example?

Awesome!

Completion rate improved to 3.33

bookЗавдання: Виконавці

Свайпніть щоб показати меню

Завдання

Уявіть, що у вас є список файлів, кожен з яких містить рядки тексту. Ваше завдання — зчитувати рядки з цих файлів паралельно та підраховувати кількість слів у кожному рядку. Для виконання завдання використовуйте ExecutorService, Future та пул потоків.

Вимоги:

  • Створення пулу потоків: Створити пул потоків фіксованого розміру за допомогою Executors.newFixedThreadPool(int nThreads), де nThreads — кількість потоків у пулі;

  • Реалізація завдання: Реалізувати клас WordCountTask, який імплементує інтерфейс Callable<String> і приймає файл як вхідний параметр. У методі call цього класу зчитувати рядки з файлу, підраховувати кількість слів у кожному рядку та повертати результат;

  • Використання ExecutorService: За допомогою ExecutorService надсилати завдання до пулу потоків для виконання. Завдання мають використовувати клас WordCountTask.

Note
Примітка

Також рядок, який ви формуєте в окремому потоці, необхідно повернути та використати метод get() інтерфейсу Future, щоб отримати результат виконання потоку та вивести його у консоль у методі main.

Зчитування з файлу

Для реалізації call() можна використовувати BufferedReader для зчитування рядків з файлів. Використовуйте блок try-with-resources, щоб ресурси автоматично закривалися.

Main.java

Main.java

copy
1
BufferedReader reader = new BufferedReader(new FileReader(file));

Використовуйте метод readLine() для зчитування кожного рядка та обов'язково перевіряйте на null, щоб визначити, коли досягнуто кінця файлу.

Далі розділіть рядок на масив рядків за допомогою методу split("\\s+") з патерном \\s+, який розділяє рядок за пробілами, а потім отримайте розмір масиву.

У самому рядку, який повертає потік, використовуйте це форматування

Main.java

Main.java

copy
1
String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)

Файли вже знаходяться у проєкті, вам не потрібно їх створювати або змінювати!

Приклад виводу

File: file1.txt | Line: Hello | Word Count: 1

File: file2.txt | Line: Hello I Love Java | Word Count: 4
File: file2.txt | Line: Lol Hello | Word Count: 2

File: file3.txt | Line: Java so so so so very nice | Word Count: 7
Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 7
some-alt