LINUX.ORG.RU

Java Многопоточность, Очереди

 ,


1

2

Есть такой класс


**
 * A Combiner takes items from multiple input queues and feeds them into a
 * single output queue. Each input queue has a priority, which determines the
 * approximate frequency at which its items are added to the output queue. E.g.
 * if queue A has priority 9.5, and queue B has priority 0.5, then on average,
 * for every 100 items added to the output queue, 95 should come from queue A,
 * and 5 should come from queue B.
 * <p>
 * Input queues can be dynamically added and removed.
 * </p>
 */
public abstract class Combiner<T> {

    protected final SynchronousQueue<T> outputQueue;

    protected Combiner(SynchronousQueue<T> outputQueue) {
        this.outputQueue = outputQueue;
    }

    /**
     * Adds the given queue to this com.tech.task.Combiner.
     *
     * @param queue          the input queue to add to this com.tech.task.Combiner
     * @param priority       the priority to assign to the input queue
     * @param isEmptyTimeout if the input queue is seen as empty for a duration
     *                       longer than isEmptyTimeout, then it is removed from the com.tech.task.Combiner
     * @param timeUnit       the time unit of the isEmptyTimeout argument
     */
    public abstract void addInputQueue(BlockingQueue<T> queue, double priority,
                                       long isEmptyTimeout, TimeUnit timeUnit) throws CombinerException;

    /**
     * Removes the given queue from this com.tech.task.Combiner.
     *
     * @param queue the input queue to remove from this com.tech.task.Combiner
     */
    public abstract void removeInputQueue(BlockingQueue<T> queue) throws CombinerException;

    /**
     * Returns true if the given queue is currently an input queue to this com.tech.task.Combiner.
     */
    public abstract boolean hasInputQueue(BlockingQueue<T> queue);

    /**
     * Thrown to indicate a com.tech.task.Combiner specific exception.
     */
    public static class CombinerException extends Exception {
        public CombinerException() {
            super();
        }

        public CombinerException(String message) {
            super(message);
        }
    }
}

К нему нужно сделать реализацию. Есть идеи ?


Считай количество обработанных элементов входных очередей и на основе этого и приоритета можно понять у какой очереди брать следующий элемент. В чём проблема-то?

orm-i-auga ★★★★★
()

Про Job написали выше. Если лаба, то лучше учись, пока не поздно. Если попросили как входное задание - лучше подумай. Потом больнее будет.

anonymous
()

Входящие итемы нужно добавлять в список итемов в порядке их поступления из входных очередей. Каждому итему поставь в соответствие counter. При добавлении итема из входной очереди устанавливай каунтер в 0. Для каждого итема сохраняй значение его приоритета. Когда наступит время решать какой итем выпихнуть в исходящую очередь увеличь каунтеры всех итемов на величину приоритета. Выбери итем обладающий наибольшим каунтером и находящийся ближе к вершине списка среди итемов с равными каунтерами.

anonymous
()
Ответ на: комментарий от takino

Делать не нужно, у меня просто небольшой ступор с SynchronousQueues. Согласно описанию java doc - A blocking queue in which each insert operation must wait for a corresponding remove operation by another thread, and vice versa. A synchronous queue does not have any internal capacity, not even a capacity of one. Просто какая-то дикая вещь этот SynchronousQueues. Уже только метод isEmpty по малому счету удивляет:

  /**
     * Always returns {@code true}.
     * A {@code SynchronousQueue} has no internal capacity.
     *
     * @return {@code true}
     */
    public boolean isEmpty() {
        return true;
    }

lestal
() автор топика
Ответ на: комментарий от orm-i-auga

Вот про счетчики я и не подумал. Спасибо.

lestal
() автор топика
Ответ на: комментарий от lestal

Эм, ну а чего тогда ты вопрос не спросил сразу? Т.е. - ты подробности о своей проблеме почти через сутки выдал :)

takino ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.