Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Завдання: ForkJoinPool | Найкращі Практики Багатопотокового Програмування
Quizzes & Challenges
Quizzes
Challenges
/
Багатопотоковість у Java

bookЗавдання: ForkJoinPool

Завдання

Уявіть, що ви організовуєте великий благодійний захід і вам потрібно підрахувати всі отримані пожертви. У вас є список сум пожертв, і ви хочете дізнатися загальну суму всіх пожертв. Щоб зробити це завдання більш керованим, ви вирішуєте розділити список на менші частини та розподілити ці частини між своїми друзями для допомоги з підрахунком. Кожен друг обчислює загальну суму для своєї призначеної частини та повідомляє результат вам. Потім ви об'єднуєте всі ці результати, щоб отримати остаточну суму.

У вас є клас DonationTask, який наслідує RecursiveTask<Long>. Вам потрібно перевизначити метод compute() у цьому класі, щоб реалізувати логіку розбиття списку пожертв і обчислення сум.

У класі DonationTask є константа поле THRESHOLD, встановлене на 200. Цей поріг визначає максимальну кількість пожертв, яку може містити одна частина. Не змінюйте цей поріг.

Наприклад, якщо ви починаєте зі списку з 1 000 пожертв, ви повинні розбити його на частини по 200 або менше пожертв у кожній. Потім обчисліть загальну суму, додаючи результати з кожної частини.

  • THRESHOLD - поріг розбиття масиву;
  • long[] listDonations - вихідний масив з усіма пожертвами;
  • int start - початок масиву;
  • int end - кінець масиву.

Існує також клас RunnableTask, у якому запускається програма. Саме тут ініціалізується наш список і виконується у ForkJoinPool. Після запуску всіх процесів відображається результат.

Якщо метод compute() реалізовано правильно, ви отримаєте загальну суму:

Sum: 500500 

Підказки до розв'язку

У методі compute() необхідно перевірити, чи розмір масиву (списку пожертвувань) менший за поточний поріг, THRESHOLD. Якщо менший — чудово; просто перебираємо всі елементи цього масиву (списку пожертвувань), підсумовуємо їх і повертаємо результат.

Якщо розмір більший, потрібно знайти середину масиву та рекурсивно обробити ліву і праву частини масиву (ніби ділимо список між друзями).

Для цього створюємо 2 об'єкти DonationTask, передаємо межі масиву та сам масив як параметри, після чого викликаємо метод fork() для цих об'єктів. Нарешті, отримуємо суму результатів, викликаючи join() для кожного завдання, додаємо результати разом і повертаємо загальну суму.

Note
Примітка

Звучить досить складно, але насправді потрібно лише зрозуміти та реалізувати ілюстрацію вище!

Впевнений, у вас все вийде! Але якщо виникнуть труднощі, ви можете переглянути розв'язок.

Коли ви впевнені, що все працює, запустіть тести перевірки за шляхом /src/test/java/TaskForkJoinTest.java.

Все було зрозуміло?

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

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

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

Запитати АІ

expand

Запитати АІ

ChatGPT

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

Suggested prompts:

Can you explain how the compute() method should be structured?

What does the DonationTask class look like?

Can you give an example of how to split the array and sum the donations?

Awesome!

Completion rate improved to 3.33

bookЗавдання: ForkJoinPool

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

Завдання

Уявіть, що ви організовуєте великий благодійний захід і вам потрібно підрахувати всі отримані пожертви. У вас є список сум пожертв, і ви хочете дізнатися загальну суму всіх пожертв. Щоб зробити це завдання більш керованим, ви вирішуєте розділити список на менші частини та розподілити ці частини між своїми друзями для допомоги з підрахунком. Кожен друг обчислює загальну суму для своєї призначеної частини та повідомляє результат вам. Потім ви об'єднуєте всі ці результати, щоб отримати остаточну суму.

У вас є клас DonationTask, який наслідує RecursiveTask<Long>. Вам потрібно перевизначити метод compute() у цьому класі, щоб реалізувати логіку розбиття списку пожертв і обчислення сум.

У класі DonationTask є константа поле THRESHOLD, встановлене на 200. Цей поріг визначає максимальну кількість пожертв, яку може містити одна частина. Не змінюйте цей поріг.

Наприклад, якщо ви починаєте зі списку з 1 000 пожертв, ви повинні розбити його на частини по 200 або менше пожертв у кожній. Потім обчисліть загальну суму, додаючи результати з кожної частини.

  • THRESHOLD - поріг розбиття масиву;
  • long[] listDonations - вихідний масив з усіма пожертвами;
  • int start - початок масиву;
  • int end - кінець масиву.

Існує також клас RunnableTask, у якому запускається програма. Саме тут ініціалізується наш список і виконується у ForkJoinPool. Після запуску всіх процесів відображається результат.

Якщо метод compute() реалізовано правильно, ви отримаєте загальну суму:

Sum: 500500 

Підказки до розв'язку

У методі compute() необхідно перевірити, чи розмір масиву (списку пожертвувань) менший за поточний поріг, THRESHOLD. Якщо менший — чудово; просто перебираємо всі елементи цього масиву (списку пожертвувань), підсумовуємо їх і повертаємо результат.

Якщо розмір більший, потрібно знайти середину масиву та рекурсивно обробити ліву і праву частини масиву (ніби ділимо список між друзями).

Для цього створюємо 2 об'єкти DonationTask, передаємо межі масиву та сам масив як параметри, після чого викликаємо метод fork() для цих об'єктів. Нарешті, отримуємо суму результатів, викликаючи join() для кожного завдання, додаємо результати разом і повертаємо загальну суму.

Note
Примітка

Звучить досить складно, але насправді потрібно лише зрозуміти та реалізувати ілюстрацію вище!

Впевнений, у вас все вийде! Але якщо виникнуть труднощі, ви можете переглянути розв'язок.

Коли ви впевнені, що все працює, запустіть тести перевірки за шляхом /src/test/java/TaskForkJoinTest.java.

Все було зрозуміло?

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

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

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