queue.hasWaitingConsumer() кто может рассказать про данный метод откуда у очереди информация про поток Consumer откуда он знает есть ли ожидающий потребитель или нет
Привет👋 Внутри LinkedTransferQueue есть структура данных, которая отслеживает количество потоков, находящихся в состоянии ожидания. Это не явный список потоков, а скорее счётчик или флаг, связанный с объектом.
В методе String.out.format где выводим фразу "Элемент 'ShareItem-N' добавлен" не принимает решение если сохранить ShareItem-N в стринг и передавать его в format.
Компилятор хочет чтобы передавали только N.
в комментарии к main:
"2. Стань на имени аргумента в конструкторе (queue) и нажми Alt+Enter"
на самом деле должно быть:
"2. Стань на имени аргумента в конструкторе (queue) и нажми Alt+Shift+Enter
Не понял почему так, но в классе Producer
я в цикле создал блок трай/кетч, и уже после обработки кетч вписал проверку ожидающего потребителя
if (queue.hasWaitingConsumer()) {
System.out.format("Consumer в ожидании!\n");
}
Так вот у меня строчка Consumer в ожидании вообще не выводилась. Подсмотрел готовое решение, там эта проверка сразу после sleep стоит. Переместил выше - сработало!
Почему так?
Также, у меня в идее программа не завершалась совсем. Но проверку прошло.
так как если пишешь после sleep, то нить завыпает и тогда остается свободный consumer, а если после цикла или до слип, то все моментально выполняется и конзумер всегда при работе, вот метод hasWaitingConsumer выдет - false. Немного корявенько написал, но надеюсь понятно
То что я вынес:
- Прочитал про класс TransferQueue. Он интересен именно для Потребителя и Поставщика.
- Исключение, обработанное внутри цикла, если это не другой выброс исключения, не прерывает цикл. Надо помнить.
Инфа по задаче:
Среднее количество попыток для этой задачи 3.15. Всего эту задачу решили 4968 учеников.
У меня вывод в консоль не совпал с выводом в output, но решение приняли.
Моё решение не выдаёт записи, что consumer в ожидании и он успевает обработать только 3 item'а.
Он не может совпасть, так как метод toString() для SharedItem нам запрещено реализовывать по своему усмотрению. А ещё потому что ничего не сказано, чтобы переносы строк добавлять, без переносов видимо принимает, но вывод будет точно отличаться
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ