Завдання: 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.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Чудово!
Completion показник покращився до 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.
Дякуємо за ваш відгук!