Java 异步通知BlockingQueue具有可用项

Java 异步通知BlockingQueue具有可用项,java,concurrency,blockingqueue,Java,Concurrency,Blockingqueue,我需要一个对象,当某个阻塞队列获得要提供的项目时,该对象将得到异步通知 我已经在Javadoc和web上搜索了一个预先制作的解决方案,然后我得到了一个(可能是幼稚的)我的解决方案,它是: interface QueueWaiterListener<T> { public void itemAvailable(T item, Object cookie); } 接口QueueWaiterListener{ 公共无效项可用(T项、对象cookie); } 及 类队列扩展线程{

我需要一个
对象
,当某个
阻塞队列
获得要提供的项目时,该对象将得到异步通知

我已经在Javadoc和web上搜索了一个预先制作的解决方案,然后我得到了一个(可能是幼稚的)我的解决方案,它是:

interface QueueWaiterListener<T> {
    public void itemAvailable(T item, Object cookie);
}
接口QueueWaiterListener{
公共无效项可用(T项、对象cookie);
}

类队列扩展线程{
受保护的最终阻塞队列;
受保护的最终QueueWaiterListener侦听器;
受保护的最终对象cookie;
公共队列服务员(BlockingQueue队列、QueueWaiterListener侦听器、对象cookie){
this.queue=队列;
this.listener=listener;
this.cookie=cookie;
}
公共队列服务员(BlockingQueue队列、QueueWaiterListener侦听器){
this.queue=队列;
this.listener=listener;
this.cookie=null;
}
@凌驾
公开募捐{
而(!isInterrupted()){
试一试{
T item=queue.take();
可用项(项,cookie);
}捕捉(中断异常e){
}
}
}
}
基本上,在队列的
take()
操作上有一个线程阻塞,每当
take()
操作成功时,它都会回调侦听器对象,可以选择发回一个特殊的
cookie
对象(如果需要,可以忽略它)


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

这看起来是队列阻塞和侦听器的一个很好的标准模式。您可以选择制作侦听器接口。如果您没有使用BlockingQueue类(我不清楚),那么唯一需要管理的是正确的
wait()
notify()
来管理阻塞调用


这个特殊的SO问题很好地概述了等待和通知以及与BlockingQueue相关的用法

也许您可以将一些
BlockingQueue
子类化(例如
ArrayBlockingQueue
LinkedBlockingQueue
或您正在使用的内容),添加对侦听器的支持并执行以下操作

@Override
public boolean add(E o) {
    super.add(o);
    notifyListeners(o);
}

这个问题的回答太迟了,但最近我正在研究一个类似的问题,这就是我使用的


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

您能告诉我更多关于wait()和notify()的信息吗在这种情况下的用法?Wait and notify是一种在引入aiobee回答的BlockingQueue类之前处理生产者-消费者问题(例如阻塞队列)的方法。请参见此问题以获得确切的说明。如果你在谷歌上搜索“wait and notify Java queue”,你会发现很多类似的引用,比如wait()和notify(),但我认为使用BlockingQueue可以立即处理它(事实上,在你提供的一个示例中,有一个BlockingQueue实现作为wait()/notify()使用场景):)Oops。。。我错过了您已经在使用BlockingQueue类的部分,并认为您正在构建自己的BlockingQueue类。我真傻。我完全应该在这里投票!不要介意!你给我指出了一些关于nt wait()/notify()的好东西要复习。你链接的主题很有趣。我不投反对票:)我喜欢。唯一的问题是我如何将其子类化,因为我不喜欢绑定到BlockingQueue的特定实现。。。i、 如果我将LinkedBlockingQueue子类化,那么我将绑定到此实现。我应该做一个“装饰师”吗?
@Override
public boolean add(E o) {
    super.add(o);
    notifyListeners(o);
}