如何实现异步队列?

时间:2015-02-25 13:30:16

标签: java concurrency java.util.concurrent

给出以下队列变化:

interface AsyncQueue<T> {
    //add new element to the queue
    void add(T elem); 
    //request single element from the queue via callback
    //callback will be called once for single polled element when it is available
    //so, to request multiple elements, poll() must be called multiple times with (possibly) different callbacks
    void poll(Consumer<T> callback);
}

我发现我不知道如何使用java.util.concurrent原语实现它!所以问题是:

  • 使用java.util.concurrent包实现它的正确方法是什么?
  • 是否可以使用其他线程池来完成此操作?

1 个答案:

答案 0 :(得分:2)

您的AsyncQueueBlockingQueue非常相似,例如ArrayBlockingQueue。返回的Future只会委托给ArrayBlockingQueue方法。例如,Future.get会调用blockingQueue.poll


至于你的更新,我假设调用add的线程应该调用回调,如果有一个等待?如果是这样,这是一个简单的任务,即为元素创建一个队列,并为回调创建一个队列。

  • 添加后,检查是否有回调等待,然后调用它,否则将元素放在元素队列上
  • 在轮询时,检查是否有元素在等待,然后用该元素调用回调,否则将回调放在回调队列上

代码大纲:

class AsyncQueue<E> {

    Queue<Consumer<E>> callbackQueue = new LinkedList<>();
    Queue<E> elementQueue = new LinkedList<>();

    public synchronized void add(E e) {
        if (callbackQueue.size() > 0)
            callbackQueue.remove().accept(e);
        else
            elementQueue.offer(e);
    }

    public synchronized void poll(Consumer<E> c) {
        if (elementQueue.size() > 0)
            c.accept(elementQueue.remove());
        else
            callbackQueue.offer(c);
    }
}