在我的 Java 应用程序中,多个线程将数据放入队列中,另一个线程(只有一个线程)从中获取对象并分派(dispatch)它们。
有时,消费线程似乎没有注意到新项目已添加到队列中,因为指示轮询的日志消息不再出现。来自生产线程的日志消息表明这些项目确实到达了。谷歌搜索告诉我这似乎被称为“错过的信号”。因为我既不等待
也不使用锁,所以我不确定这是否适用于我。
真正让我困惑的是,当我中断消费者线程时,它会处理队列中的所有项目,然后再次保持沉默,永远不会退出。
这是消费者线程的主循环,生产者线程做一些事情,比如从套接字读取,它们唯一的共同点是它们在消费者正在轮询的队列上使用 add()
。
public class FieldFrontService
{
// ...
private ConcurrentLinkedQueue<Transmission> _qRec;
// ...
private Runnable _createReceptionist()
{
return new Runnable() {
@Override
public void run()
{
while (!Thread.currentThread().isInterrupted()) {
Transmission tx = FieldFrontService.this._qRec.poll();
if (null == tx) {
try {
Thread.sleep(250);
} catch (InterruptedException e) {
break;
}
} else {
FieldFrontService.this._receiveTransmission(tx);
}
}
}
}
// ...
}
最佳答案
也许您最好使用结合了线程池和队列的 ExecutorService。它也有效。 ;)
public class FieldFrontService {
private final ExecutorService executor = Executors.newSingleThreadExecutor();
void receiveTransmission(final Transmission tx) {
executor.execute(new Runnable() {
public void run() {
FieldFrontService.this._receiveTransmission(tx);
}
});
}
}
关于java - (如何)我可以用这个 ConcurrentLinkedQueue 和 sleep() 得到 "miss a signal"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5910529/