12

当有些人有要提供的物品时,我需要Object异步通知。BlockingQueue

我已经在 J​​avadoc 和网络上搜索了一个预制的解决方案,然后我最终得到了一个(可能是天真的)我的解决方案,这里是:

interface QueueWaiterListener<T> {
    public void itemAvailable(T item, Object cookie);
}

class QueueWaiter<T> extends Thread {

    protected final BlockingQueue<T> queue;
    protected final QueueWaiterListener<T> listener;
    protected final Object cookie;

    public QueueWaiter(BlockingQueue<T> queue, QueueWaiterListener<T> listener, Object cookie) {
        this.queue = queue;
        this.listener = listener;
        this.cookie = cookie;
    }

    public QueueWaiter(BlockingQueue<T> queue, QueueWaiterListener<T> listener) {
        this.queue = queue;
        this.listener = listener;
        this.cookie = null;
    }

    @Override
    public void run() {
        while (!isInterrupted()) {
            try {
                T item = queue.take();
                listener.itemAvailable(item, cookie);
            } catch (InterruptedException e) {
            }
        }
    }
}

基本上,队列的操作有一个线程阻塞,take()每次take()操作成功时都会回调侦听器对象,可以选择发回一个特殊cookie对象(如果需要,请忽略它)。

问题是:有没有更好的方法来做到这一点?我是否犯了一些不可原谅的错误(在并发/效率和/或代码清洁方面)?提前致谢。

4

3 回答 3

13

也许您可以子类一些BlockingQueue(例如ArrayBlockingQueueLinkedBlockingQueue或您正在使用的东西),添加对侦听器的支持并执行

@Override
public boolean add(E o) {
    super.add(o);
    notifyListeners(o);
}
于 2011-09-06T10:14:50.573 回答
0

这看起来像是队列阻塞和侦听器的一个很好的标准模式。您在制作侦听器接口方面做出了不错的选择。如果您没有使用 BlockingQueue 类(我不清楚),唯一的事情是您管理的是正确的wait()并且notify()用于管理阻塞调用。

这个特殊的 SO 问题“在 java 中使用 wait() 和 notify() 的简单场景”很好地概述了 wait 和 notify 以及与 BlockingQueue 相关的用法

于 2011-09-06T10:14:15.347 回答
0

这个回复在这个话题上为时已晚,但最近我正在研究一个类似的问题,这就是我使用的。

当 BlockingQueue 接收到一个项目/对象时,我使用了 Spring 的 SimpleApplicationEventMulticaster,它支持异步事件处理。基本上,我发布了一个事件并将其配置为异步处理而不是阻塞同一个执行线程,只要 BlockingQueue 中有要处理的项目,队列消费者就可以继续消费,而事件侦听器/消费者可以异步执行操作。

于 2020-03-03T18:44:08.940 回答