在生产者 - 消费者模型中(一个线程生成项目,将其置于阻塞队列中,另一个线程在无限循环中使用它们),建议通过发送导致循环中断的毒物对象来关闭线程。
Afaik,这可以通过使用:
来完成null
(一般不鼓励,BlockingQueue
禁止)Optional
)(需要昂贵的对象分配)对于每个生产的项目)我正在为任意队列项寻找类型安全的解决方案。
答案 0 :(得分:0)
好的,这就是我要做的事情:
我将定义一个所有消息都需要实现的接口:
public interface Message {
public default boolean continueProcessing() {
return true;
}
}
然后是一个Poison枚举类:
public enum Poison implements Message {
INSTANCE;
@Override
public boolean continueProcessing() {
return false;
}
}
消费者代码如下所示:
@Override
public void run() {
while (true) {
Message msg = queue.take();
if (!msg.continueProcessing()) {
break;
}
doSomethingWith(msg);
}
}
答案 1 :(得分:0)
您可以使用毒丸。价值无关紧要:
制片:
class Producer{
public static final ItemType POISON = new ItemType();
// rest goes here
}
消费者:
class Consumer{
void run(){
for(;;){
ItemType item = queue.take();
if( item == Producer.POISON ) // <- not checking value of item here!
break;
handleItem( item );
}
}
}
这也适用于类似Integer的类型,如果您确保POISON
高速缓存,则可以对其进行高速缓存。
在不知道你的ItemType实际是什么的情况下,这是我向你建议的最好的(恕我直言)。
我想到的另一个想法是在Producer上引入一个字段,表示在清空队列后不再需要Item。这意味着以某种方式对消费者代码中的空队列进行额外检查。这也意味着你不能阻塞空队列......在实现这个时要考虑很多。