Завдання: 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() для кожного завдання, додаємо результати разом і повертаємо загальну суму.
Звучить досить складно, але насправді потрібно лише зрозуміти та реалізувати ілюстрацію вище!
Впевнений, у вас все вийде! Але якщо виникнуть труднощі, ви можете переглянути розв'язок.
Коли ви впевнені, що все працює, запустіть тести перевірки за шляхом /src/test/java/TaskForkJoinTest.java.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
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
Завдання: 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() для кожного завдання, додаємо результати разом і повертаємо загальну суму.
Звучить досить складно, але насправді потрібно лише зрозуміти та реалізувати ілюстрацію вище!
Впевнений, у вас все вийде! Але якщо виникнуть труднощі, ви можете переглянути розв'язок.
Коли ви впевнені, що все працює, запустіть тести перевірки за шляхом /src/test/java/TaskForkJoinTest.java.
Дякуємо за ваш відгук!