Завдання: 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 і запустіть усі тести.
Якщо вони виконуються успішно, вітаємо — все зроблено правильно! Якщо ні, або рішення неправильне, або було змінено щось, що не слід було змінювати.
Також спробуйте розв'язати задачу самостійно, але якщо не вийде і ви хочете дізнатися відповідь, є посилання на розв'язок. Не просто копіюйте код, а спробуйте розібратися!
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Awesome!
Completion rate improved to 3.33
Завдання: 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 і запустіть усі тести.
Якщо вони виконуються успішно, вітаємо — все зроблено правильно! Якщо ні, або рішення неправильне, або було змінено щось, що не слід було змінювати.
Також спробуйте розв'язати задачу самостійно, але якщо не вийде і ви хочете дізнатися відповідь, є посилання на розв'язок. Не просто копіюйте код, а спробуйте розібратися!
Дякуємо за ваш відгук!