@ gstackoverflow: Основная проблема ограниченной очереди заключается в том, что она имеет максимальную емкость, поэтому, если ваша ограниченная очередь заполнена, вы будете заблокированы, когда захотите добавить эту «таблетку отравы».
Имейте в виду, что таблетка отравления должна быть помещена немедленно и не может ждать, пока в очереди появится свободное место , так как этот метод используется для корректного отключения потребителей, когда возникает исключение (в противном случае существует более приятная техника отключить потребителей).
Редактировать : В качестве примера говорится более тысячи предложений, давайте рассмотрим простой пример (все кредиты для примера идут на Java Concurrency на практике ) с потоком продюсера и потребительская нить:
public class CrawlerThread extends Thread { //The Producer Thread
public void run() {
try {
crawl(root);
} catch (InterruptedException e) { /* fall through */ }
finally {
while (true) {
try {
queue.put(POISON);
break;
} catch (InterruptedException e1) { /* retry */ }
}
}
}
private void crawl(File root) throws InterruptedException {
//some code
}
}
public class IndexerThread extends Thread { //The consumer Thread
public void run() {
try {
while (true) {
File file = queue.take();
if (file == POISON)
break;
else
indexFile(file);
}
} catch (InterruptedException consumed) { }
}
}
Теперь, когда вы проверяете поток производителя (CrawlerThread), вы видите, что таблетка с ядом помещается либо в конце цикла, либо в более тяжелой ситуации, когда возникает исключение.
Теперь предположим, что вы хотите использовать ограниченную очередь в качестве интерфейса между производителем и потребителем. Предположим, что очередь заполнена в момент времени t, а в момент времени t возникает исключение, так как производитель не будет в состоянии поместить таблетку отравления в очередь, и вместо того, чтобы отключить поток потребителя, потребитель все еще будет ожидать поступления элементов в очередь. Поэтому, если вы используете ограниченную очередь, не рекомендуется использовать таблетки с ядом, поскольку это может привести к неожиданному результату.