Завдання: BlockingQueue
Свайпніть щоб показати меню
Завдання
Потрібно реалізувати деякі методи BlockingQueue, щоб краще зрозуміти, як працює ця колекція, а також для кращого засвоєння матеріалу!
Потрібно перейти до BlockingQueueueImpl, у самому класі будуть 2 нереалізовані методи, які необхідно реалізувати самостійно. Не потрібно вигадувати складне рішення, достатньо повторити функціональність звичайного BlockingQueueue.
Також у вас є клас Main, у якому потрібно протестувати свій BlockingQueueueImpl, щоб переконатися в його коректній роботі.
Це можна перевірити шляхом додавання більше ніж 10 елементів до queue (або більше, ніж значення limit, яке ви ініціалізували у конструкторі), і наступний елемент буде змушений чекати, поки у черзі не стане менше елементів, ніж ліміт, і лише тоді буде записано наступний елемент.
put() — синхронізований метод, який додає елементи до черги, якщо ліміт черги не перевищено; якщо перевищено — призупиняє чергу.
take() — синхронізований метод, який бере елемент із черги, повертає його та видаляє; якщо черга порожня — призупиняє її.
Підказка до розв'язання
Для реалізації put() потрібно перевірити, чи черга заповнена, тобто чи не дорівнює вона ліміту, і якщо так — призупинити потік. Якщо черга не заповнена, слід перевірити її на порожнечу (isEmpty()), і якщо потік порожній, викликати метод, який звільняє усі потоки (notifyAll()). Далі додати елемент до queue.
Для реалізації take() потрібно перевірити, чи черга порожня; якщо так — призупинити потік (оскільки немає що зчитувати), якщо черга не порожня — зробити ще одну перевірку на заповненість списку, і якщо розмір списку дорівнює limit, тоді звільнити всі потоки та повернути перший елемент у черзі (той, який був доданий раніше за інші).
Методи, які знадобляться для виконання
wait()— призупиняє потік;notifyAll()— пробуджує всі призупинені потоки;queue.isEmpty()— перевіряє, чи черга порожня (true — черга порожня).
Після реалізації цих методів і тестування у класі Main, перейдіть до /src/test/java/BlockingQueueueImplTest.java і запустіть усі тести.
Якщо вони виконуються успішно, вітаємо — все зроблено правильно! Якщо ні, або рішення неправильне, або було змінено щось, що не слід було змінювати.
Також спробуйте розв'язати задачу самостійно, але якщо не вийде і ви хочете дізнатися відповідь, є посилання на розв'язок. Не просто копіюйте код, а спробуйте розібратися!
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат