Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Завдання: ForkJoinPool | Найкращі Практики Багатопотокового Програмування
Багатопотоковість у 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

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

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