powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему poison pill не будет работать для bounded очередей?
25 сообщений из 47, страница 1 из 2
Почему poison pill не будет работать для bounded очередей?
    #39408579
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возьмём ArrayBlockingQueue и LinkedBlockingQueue.

Самая важная разница в контексте моего вопроса в том, что первая очередь ограниченная.

ArrayBlockingQueue конструктор имеет параметр fair.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
/**
     * Creates an {@code ArrayBlockingQueue} with the given (fixed)
     * capacity and the specified access policy.
     *
     * @param capacity the capacity of this queue
     * @param fair if {@code true} then queue accesses for threads blocked
     *        on insertion or removal, are processed in FIFO order;
     *        if {@code false} the access order is unspecified.
     * @throws IllegalArgumentException if {@code capacity < 1}
     */
    public ArrayBlockingQueue(int capacity, boolean fair) {
        if (capacity <= 0)
            throw new IllegalArgumentException();
        this.items = new Object[capacity];
        lock = new ReentrantLock(fair);
        notEmpty = lock.newCondition();
        notFull =  lock.newCondition();
    }



и тут есть параметр fair, который имеет тот же смыл, что и в ReentrantLock

Я так понимаю он имеет смысл в двух случаях.
1. Допустим мы сейчас добавляем элемент в очередь и пока мы это делаем прилетело ещё 2 элемента на добавление, и тут на второе место в очереди может попасть как первый, так и второй из конкурирующих потоков в очереди.
2. В случае переполнения очереди потоки выстраиваются либо в очередь(в случае fair) либо порядок захвата очереди неопределен


Судя по имплементации LinkedBlockingQueue тут есть такая же проблема:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
public boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException {

        if (e == null) throw new NullPointerException();
        long nanos = unit.toNanos(timeout);
        int c = -1;
        final ReentrantLock putLock = this.putLock;
        final AtomicInteger count = this.count;
        putLock.lockInterruptibly();
        try {
            while (count.get() == capacity) {
                if (nanos <= 0)
                    return false;
                nanos = notFull.awaitNanos(nanos);
            }
            enqueue(new Node<E>(e));
            c = count.getAndIncrement();
            if (c + 1 < capacity)
                notFull.signal();
        } finally {
            putLock.unlock();
        }
        if (c == 0)
            signalNotEmpty();
        return true;
    }



Теперь собственно о вопросе:

В concurrency in practice написано следующее:

poison pill техника почему-то будет работать только на неограниченных очередях. Я не понял почему. Также я не понял как использовать эту технику когда много consumer-ов и producer-ов

Пример использования этой техники из книги:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
/**
 * IndexingService
 * <p/>
 * Shutdown with poison pill
 *
 * @author Brian Goetz and Tim Peierls
 */
public class IndexingService {
    private static final int CAPACITY = 1000;
    private static final File POISON = new File("");
    private final IndexerThread consumer = new IndexerThread();
    private final CrawlerThread producer = new CrawlerThread();
    private final BlockingQueue<File> queue;
    private final FileFilter fileFilter;
    private final File root;

    public IndexingService(File root, final FileFilter fileFilter) {
        this.root = root;
        this.queue = new LinkedBlockingQueue<File>(CAPACITY);
        this.fileFilter = new FileFilter() {
            public boolean accept(File f) {
                return f.isDirectory() || fileFilter.accept(f);
            }
        };
    }

    private boolean alreadyIndexed(File f) {
        return false;
    }

    class CrawlerThread extends 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 {
            File[] entries = root.listFiles(fileFilter);
            if (entries != null) {
                for (File entry : entries) {
                    if (entry.isDirectory())
                        crawl(entry);
                    else if (!alreadyIndexed(entry))
                        queue.put(entry);
                }
            }
        }
    }

    class IndexerThread extends Thread {
        public void run() {
            try {
                while (true) {
                    File file = queue.take();
                    if (file == POISON)
                        break;
                    else
                        indexFile(file);
                }
            } catch (InterruptedException consumed) {
            }
        }

        public void indexFile(File file) {
            /*...*/
        };
    }

    public void start() {
        producer.start();
        consumer.start();
    }

    public void stop() {
        producer.interrupt();
    }

    public void awaitTermination() throws InterruptedException {
        consumer.join();
    }
}
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408590
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerpoison pill техника почему-то будет работать только на неограниченных очередях. Я не понял почему.
По-моему у тебя опять трудности перевода. Приводил бы что ли оригинальные цитаты.
Ну, и проблема с использованием poison pill в bounded queue в том что очередь может быть заполнена.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408593
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerТакже я не понял как использовать эту технику когда много consumer-ов и producer-ов
Конкретизируй что именно не понятно? Очередь же одна.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408600
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestionerpoison pill техника почему-то будет работать только на неограниченных очередях. Я не понял почему.
По-моему у тебя опять трудности перевода. Приводил бы что ли оригинальные цитаты.
Ну, и проблема с использованием poison pill в bounded queue в том что очередь может быть заполнена.

А чем нам мешает тот факт, что она заполнена?

по поводу цитаты:

авторPoison pills work reliably only with unbound queues.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408609
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczquestionerТакже я не понял как использовать эту технику когда много consumer-ов и producer-ов
Конкретизируй что именно не понятно? Очередь же одна.

когда один consumer и один producer
producer шлёт ядовитое сообщение в очередь. как только consumer его получил - закрываем лавочку.


когда много producer-ов и один consumer

Каждый producer шлёт ядовитое сообщение в очередь. как только consumer получил сообщение столько, сколько producer-ов - закрываем лавочку.



как быть если много producer-ов и consumer -ов ?
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408611
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очепятка
авторКаждый producer шлёт ядовитое сообщение в очередь. как только consumer получил сообщение столько, сколько producer-ов - закрываем лавочку.


Каждый producer шлёт ядовитое сообщение в очередь. как только consumer получил сообщений столько, сколько producer-ов - закрываем лавочку.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408616
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerА чем нам мешает тот факт, что она заполнена?
Тем что в ней нет места для poison pill.

questionerавторPoison pills work reliably only with unbound queues.
Вот именно reliably ты из своего перевода почему-то выкинул. Речь, ведь, не о том что не будет работать совсем.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408619
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerкак быть если много producer-ов и consumer -ов ?
Считаешь и тех и других. Последний разгребатель разгребает все. Остальные перед уходом возвращают пилюлю в очередь.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408626
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczquestionerА чем нам мешает тот факт, что она заполнена?
Тем что в ней нет места для poison pill.

Места нет - заблокируемся ведь до появления этого самого места, когда consumer разгребется.

BlazkowiczВот именно reliably ты из своего перевода почему-то выкинул. Речь, ведь, не о том что не будет работать совсем.

Да, ок, я подразумевал, что должно корректно "всегда", а этого не обещают
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408628
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньевquestionerкак быть если много producer-ов и consumer -ов ?
Считаешь и тех и других. Последний разгребатель разгребает все. Остальные перед уходом возвращают пилюлю в очередь.

а как последний понимает, что он последний?

Можно пример? пусть у нас 3 продюсера и 2 консумера.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408630
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

questioner Места нет - заблокируемся ведь до появления этого самого места, когда consumer разгребется.

Место появилось и сообщение таки в очередь проберется. и таки до консумера долетит.

Если используем fair, то и даже в нужном порядке долетит.

Хотят смотрю в LinkedBlockingQueue используется обычный не fair ReentrantLock и там даже не предлагают этот параметр выставлять.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408633
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerМеста нет - заблокируемся ведь до появления этого самого места, когда consumer разгребется.
В приведенном коде он отваливал по первой пилюле. А хвост никто не разгребал.
Могло оказаться так, что хвост бы оставался. Как ты заметил нужен счетчик пилюль.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408634
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевquestionerМеста нет - заблокируемся ведь до появления этого самого места, когда consumer разгребется.
В приведенном коде он отваливал по первой пилюле. А хвост никто не разгребал.
Могло оказаться так, что хвост бы оставался. Как ты заметил нужен счетчик пилюль.

пример для варианта, что один консумер и один продюсер, поэтому и не надо ничего разгребать.


аааааа, кажется вкурил. Проблема в том, что несколько сигналов на остановку могут быть посланы разными потоками(хотя и одним тоже может)? первый сигнал обработается, консумер остановится, а если при добавлении второго он заблочится, то он так и останется висеть?
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408656
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача в общем то проста.
В очереди посылается сигнал о том, что надо отвалится.
Разгребатель отваливает. Если очередь не ограничена, то все уходят и оставляют мусор в очереди.
Если очередь ограничена, то может сложиться ситуация, что разгребатель отвалил, а желающих набросать мусор еще навалом (ну их больше одного). Но мусорный бак переполнен.
И все они будут ждать, пока разгребатель вернется, а он этого никогда не сделает.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408684
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевЗадача в общем то проста.
В очереди посылается сигнал о том, что надо отвалится.
Разгребатель отваливает. Если очередь не ограничена, то все уходят и оставляют мусор в очереди.
Если очередь ограничена, то может сложиться ситуация, что разгребатель отвалил, а желающих набросать мусор еще навалом (ну их больше одного). Но мусорный бак переполнен.
И все они будут ждать, пока разгребатель вернется, а он этого никогда не сделает.

В примере из книги если у нас много загребателей и всего один разгребатель, то каждый загребатель шлёт сигнал и наш любимый разгребатель считает количество этих сигналов. Как только количество сигналов равно количеству загребателей, разгребатель может угомониться.

Но это не очень похоже на Ваш вариант.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408689
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в книге пишут, чтобы каждый продюсер положил в очередь столько ядовитых сообщение сколько у нас разгребателей. Но детали не уточнены
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408703
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Я подумал, может я что-то очевидное не понимаю. написал небольшой тестик:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class QueueTest {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue queue = new ArrayBlockingQueue(1);
        queue.put(1);
        System.out.println("put 1");
        Thread.sleep(3000);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    queue.put(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("put 2");
            }
        }).start();
        Thread.sleep(6000);
        System.out.println("Took " + queue.take());
    }
}




выводит
авторput 1
Took 1
put 2

Не понятно в чем проблема.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408730
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerв книге пишут, чтобы каждый продюсер положил в очередь столько ядовитых сообщение сколько у нас разгребателей. Но детали не уточнены
Ну это следующий шаг.
Но положим, что загребателей 101, а разгребателей 10. Это означает, что появится желание накидать 1010 пилюль. если случится гонка, то между ними влезут и не пилюли. А тпеперь финт ушами. Все разгребатели съели пилюли от первого загребателя. Вопрос сможет ли последний загребатель накидать все пилюли в очередь на 1000 элементов?
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408762
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,
Проблем как раз таки нет, queue.put(2) ждет когда освободится место в очереди (1) для вставки, а это происходит после queue.take().
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408798
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892,

ну дак и я про то же. как по мне это не отличается от того, что в книге написано, но видимо Goetz что-то другое думал, когда писал этот пример
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408799
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньевquestionerв книге пишут, чтобы каждый продюсер положил в очередь столько ядовитых сообщение сколько у нас разгребателей. Но детали не уточнены
Ну это следующий шаг.
Но положим, что загребателей 101, а разгребателей 10. Это означает, что появится желание накидать 1010 пилюль. если случится гонка, то между ними влезут и не пилюли. А тпеперь финт ушами. Все разгребатели съели пилюли от первого загребателя. Вопрос сможет ли последний загребатель накидать все пилюли в очередь на 1000 элементов?

не сможет... но это Вы к чему, я не понял.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408802
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
к тому же там не написано, что этот подход не работает, только для варианта когда разгребателей много.

В самом простом случае 1 загребатель и 1 разгребатель

на какой очереди тут будет проблема?

ну может на 2 загребателях, если на одном ни как?
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408807
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле использования терминирующей таблетки очевидно недостаток дизайна система. В рабочих системах используется для этого модель не производитель/потребитель, а издатель/подписчик. Достаточно опубликовать одно сообщение чтоб группа подписчиков свернула свою потребительскую деятельность. Раздовать каждому по таблетке это ГОСПЛАН какой-то если кто помнит как это было в эпоху развитого социализма.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408892
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerне сможет... но это Вы к чему, я не понял.
К вопросу чем может помешать конечность очереди.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408896
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergunkaДостаточно опубликовать одно сообщение чтоб группа подписчиков свернула свою потребительскую деятельность.
Вы шину то с очередью не путаете? Из очереди может прочитать только один. Соответственно надо гарантировать, что прочтут все.
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему poison pill не будет работать для bounded очередей?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]