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

bookЗавдання: BlockingQueue

Завдання

Потрібно реалізувати деякі методи BlockingQueue, щоб краще зрозуміти, як працює ця колекція, а також для кращого засвоєння матеріалу!

Потрібно перейти до BlockingQueueueImpl, у самому класі будуть 2 нереалізовані методи, які необхідно реалізувати самостійно. Не потрібно вигадувати складне рішення, достатньо повторити функціональність звичайного BlockingQueueue.

Note
Примітка

Також у вас є клас Main, у якому потрібно протестувати свій BlockingQueueueImpl, щоб переконатися в його коректній роботі.

Це можна перевірити шляхом додавання більше ніж 10 елементів до queue (або більше, ніж значення limit, яке ви ініціалізували у конструкторі), і наступний елемент буде змушений чекати, поки у черзі не стане менше елементів, ніж ліміт, і лише тоді буде записано наступний елемент.

put()синхронізований метод, який додає елементи до черги, якщо ліміт черги не перевищено; якщо перевищено — призупиняє чергу.

take()синхронізований метод, який бере елемент із черги, повертає його та видаляє; якщо черга порожня — призупиняє її.

Підказка до розв'язання

Для реалізації put() потрібно перевірити, чи черга заповнена, тобто чи не дорівнює вона ліміту, і якщо так — призупинити потік. Якщо черга не заповнена, слід перевірити її на порожнечу (isEmpty()), і якщо потік порожній, викликати метод, який звільняє усі потоки (notifyAll()). Далі додати елемент до queue.

Для реалізації take() потрібно перевірити, чи черга порожня; якщо так — призупинити потік (оскільки немає що зчитувати), якщо черга не порожня — зробити ще одну перевірку на заповненість списку, і якщо розмір списку дорівнює limit, тоді звільнити всі потоки та повернути перший елемент у черзі (той, який був доданий раніше за інші).

Методи, які знадобляться для виконання

  • wait() — призупиняє потік;
  • notifyAll() — пробуджує всі призупинені потоки;
  • queue.isEmpty() — перевіряє, чи черга порожня (true — черга порожня).

Після реалізації цих методів і тестування у класі Main, перейдіть до /src/test/java/BlockingQueueueImplTest.java і запустіть усі тести.

Якщо вони виконуються успішно, вітаємо — все зроблено правильно! Якщо ні, або рішення неправильне, або було змінено щось, що не слід було змінювати.

Note
Примітка

Також спробуйте розв'язати задачу самостійно, але якщо не вийде і ви хочете дізнатися відповідь, є посилання на розв'язок. Не просто копіюйте код, а спробуйте розібратися!

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

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

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

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

Запитати АІ

expand

Запитати АІ

ChatGPT

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

Awesome!

Completion rate improved to 3.33

bookЗавдання: BlockingQueue

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

Завдання

Потрібно реалізувати деякі методи BlockingQueue, щоб краще зрозуміти, як працює ця колекція, а також для кращого засвоєння матеріалу!

Потрібно перейти до BlockingQueueueImpl, у самому класі будуть 2 нереалізовані методи, які необхідно реалізувати самостійно. Не потрібно вигадувати складне рішення, достатньо повторити функціональність звичайного BlockingQueueue.

Note
Примітка

Також у вас є клас Main, у якому потрібно протестувати свій BlockingQueueueImpl, щоб переконатися в його коректній роботі.

Це можна перевірити шляхом додавання більше ніж 10 елементів до queue (або більше, ніж значення limit, яке ви ініціалізували у конструкторі), і наступний елемент буде змушений чекати, поки у черзі не стане менше елементів, ніж ліміт, і лише тоді буде записано наступний елемент.

put()синхронізований метод, який додає елементи до черги, якщо ліміт черги не перевищено; якщо перевищено — призупиняє чергу.

take()синхронізований метод, який бере елемент із черги, повертає його та видаляє; якщо черга порожня — призупиняє її.

Підказка до розв'язання

Для реалізації put() потрібно перевірити, чи черга заповнена, тобто чи не дорівнює вона ліміту, і якщо так — призупинити потік. Якщо черга не заповнена, слід перевірити її на порожнечу (isEmpty()), і якщо потік порожній, викликати метод, який звільняє усі потоки (notifyAll()). Далі додати елемент до queue.

Для реалізації take() потрібно перевірити, чи черга порожня; якщо так — призупинити потік (оскільки немає що зчитувати), якщо черга не порожня — зробити ще одну перевірку на заповненість списку, і якщо розмір списку дорівнює limit, тоді звільнити всі потоки та повернути перший елемент у черзі (той, який був доданий раніше за інші).

Методи, які знадобляться для виконання

  • wait() — призупиняє потік;
  • notifyAll() — пробуджує всі призупинені потоки;
  • queue.isEmpty() — перевіряє, чи черга порожня (true — черга порожня).

Після реалізації цих методів і тестування у класі Main, перейдіть до /src/test/java/BlockingQueueueImplTest.java і запустіть усі тести.

Якщо вони виконуються успішно, вітаємо — все зроблено правильно! Якщо ні, або рішення неправильне, або було змінено щось, що не слід було змінювати.

Note
Примітка

Також спробуйте розв'язати задачу самостійно, але якщо не вийде і ви хочете дізнатися відповідь, є посилання на розв'язок. Не просто копіюйте код, а спробуйте розібратися!

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

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

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

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