powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему poison pill не будет работать для bounded очередей?
47 сообщений из 47, показаны все 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
Почему poison pill не будет работать для bounded очередей?
    #39408897
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerВ самом простом случае 1 загребатель и 1 разгребатель
на какой очереди тут будет проблема?
Да на таком вырожденном случае и без очереди проблем нет.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408924
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньевquestionerне сможет... но это Вы к чему, я не понял.
К вопросу чем может помешать конечность очереди.

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

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

То есть проблем не будет при соотношениях:

1-1
1-М
М-1

Для М-М работать на ограниченных очередях не будет.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408960
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

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

Пусть у нас 1000 писателей, один читатель и очередь длиной 1000.

В силу каких-то IO задержек или по вине шедулера читатель заснул.
В это время писатели забили очередь. 999 повисли с попыткой записать что-нибудь.
Начался shutdown. 1000-й писатель повис на отпавке пилюли.
-- честные жители засыпают просыпается мафия ---
Проснулся наконец читатель. Выгреб 1000 сообщений. Очередь оказалась следка не fair и пилюля обогнала 999 других сообщений. По мере разгребания пришли в себя писатели и попытались накидали 999 пилюль. Пока зависли - в очереди 1000 сообщений из которых первая пилюля. Один писатель отвалил. Если читатель отвалит по первой пилюле то, еще один писатель отвалит. А 998 останутся ждать разгребания очереди.
Поэтому модели одной пилюли маловато, надо вводить счетчик. и т.п. и т.д.
И это еще без варианта, что в процессе shutdown писатель может накидать несколько сообщений.

Ну или неограниченную очередь или честную (что по сути почти тоже самое - ибо все одно надо хранить порядок кто за кем за пределами capacity) :)
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39408986
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев Ну или неограниченную очередь или честную (что по сути почти тоже самое - ибо все одно надо хранить порядок кто за кем за пределами capacity) :)

Я думал над этим и думаю, что неограниченная очередь не fair.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    final ReentrantLock lock = new ReentrantLock();
    .....
    public void putFirst(E e) throws InterruptedException {
        if (e == null) throw new NullPointerException();
        Node<E> node = new Node<E>(e);
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            while (!linkFirst(node))
                notFull.await();
        } finally {
            lock.unlock();
        }
    }




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


Вот тут непонятно.

Что значит "отвалит"?
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39409114
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЧто значит "отвалит"?
Уйдет на покой - т.е. сделает то, что от него требуется при shutdown.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39409122
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевquestionerЧто значит "отвалит"?
Уйдет на покой - т.е. сделает то, что от него требуется при shutdown.

Ну дак а в случае если contention на вставку в очередь будет, то такая же история приключится
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39409190
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Об том и речь, что приходится считать сколько читателей, в зависимости от количества читателей и писателей делать длину очереди и пр. И все ради возможности отвалить не по таймауту.
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39409207
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев,

так а ограниченность очереди то тут каким боком?
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39409228
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

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

В нее должны гарантированно поместится все пилюли и прочее что может накопиться между ними.

Это будет проблемой только для М-М?

в других случаях нам же не надо ничего нового в очередь добавлять, просто потихоньку съедаем пилюли и считаем их
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39409467
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевSergunkaДостаточно опубликовать одно сообщение чтоб группа подписчиков свернула свою потребительскую деятельность.
Вы шину то с очередью не путаете? Из очереди может прочитать только один. Соответственно надо гарантировать, что прочтут все.

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

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

Пусть у нас 1000 писателей, один читатель и очередь длиной 1000.

В силу каких-то IO задержек или по вине шедулера читатель заснул.
В это время писатели забили очередь. 999 повисли с попыткой записать что-нибудь.
Начался shutdown. 1000-й писатель повис на отпавке пилюли.
-- честные жители засыпают просыпается мафия ---
Проснулся наконец читатель. Выгреб 1000 сообщений. Очередь оказалась следка не fair и пилюля обогнала 999 других сообщений. По мере разгребания пришли в себя писатели и попытались накидали 999 пилюль. Пока зависли - в очереди 1000 сообщений из которых первая пилюля. Один писатель отвалил. Если читатель отвалит по первой пилюле то, еще один писатель отвалит. А 998 останутся ждать разгребания очереди.
Поэтому модели одной пилюли маловато, надо вводить счетчик. и т.п. и т.д.
И это еще без варианта, что в процессе shutdown писатель может накидать несколько сообщений.

Ну или неограниченную очередь или честную (что по сути почти тоже самое - ибо все одно надо хранить порядок кто за кем за пределами capacity) :)

Я тут залез в сорцы ThreadPoolExecutor. В очередь сообщения добавляются только через offer, что значит, что сообщение либо сразу добавится(вернётся true), либо не добавится и вернется false. То есть продюсеры висеть не будут. Или Вы про contention ожидание писали?
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39411160
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerЯ тут залез в сорцы ThreadPoolExecutor. В очередь сообщения добавляются только через offer, что значит, что сообщение либо сразу добавится(вернётся true), либо не добавится и вернется false. То есть продюсеры висеть не будут.
Какие-то у тебя сильно далеко идущие выводы. Про то что внутри executor-а есть очередь со своим поведением, про это в сырцах не написано?
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39411170
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczquestionerЯ тут залез в сорцы ThreadPoolExecutor. В очередь сообщения добавляются только через offer, что значит, что сообщение либо сразу добавится(вернётся true), либо не добавится и вернется false. То есть продюсеры висеть не будут.
Какие-то у тебя сильно далеко идущие выводы. Про то что внутри executor-а есть очередь со своим поведением, про это в сырцах не написано?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    /**
     * The queue used for holding tasks and handing off to worker
     * threads.  We do not require that workQueue.poll() returning
     * null necessarily means that workQueue.isEmpty(), so rely
     * solely on isEmpty to see if the queue is empty (which we must
     * do for example when deciding whether to transition from
     * SHUTDOWN to TIDYING).  This accommodates special-purpose
     * queues such as DelayQueues for which poll() is allowed to
     * return null even if it may later return non-null when delays
     * expire.
     */
    private final BlockingQueue<Runnable> workQueue;



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }




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

И по вот этому конструктору ты понял что метод offer не блокирующий? А заглянуть, например, в ArrayBlockingQueue.offer() не догадался?
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39411192
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczquestioner,

И по вот этому конструктору ты понял что метод offer не блокирующий? А заглянуть, например, в ArrayBlockingQueue.offer() не догадался?

по этому конструктору я понял, что никаких манипуляций с очередь не делают, не оборачивают и всё такое
BlockingQueue interface:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    /**
     * Inserts the specified element into this queue if it is possible to do
     * so immediately without violating capacity restrictions, returning
     * {@code true} upon success and {@code false} if no space is currently
     * available.  When using a capacity-restricted queue, this method is
     * generally preferable to {@link #add}, which can fail to insert an
     * element only by throwing an exception.
     *
     * @param e the element to add
     * @return {@code true} if the element was added to this queue, else
     *         {@code false}
     * @throws ClassCastException if the class of the specified element
     *         prevents it from being added to this queue
     * @throws NullPointerException if the specified element is null
     * @throws IllegalArgumentException if some property of the specified
     *         element prevents it from being added to this queue
     */
    boolean offer(E e);
...
Рейтинг: 0 / 0
Почему poison pill не будет работать для bounded очередей?
    #39411520
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

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

Ошибся. Каюсь.
...
Рейтинг: 0 / 0
47 сообщений из 47, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему poison pill не будет работать для bounded очередей?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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