java - (如何)我可以用这个 ConcurrentLinkedQueue 和 sleep() 得到 "miss a signal"吗?

标签 java multithreading queue

在我的 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/

相关文章:

java - 如何减少这段代码以仅使用一个 while 循环?

java - 处理来自 BT 芯片的周期性心跳消息

c - 避免空链表的段错误

multithreading - 广播到多个线程的队列条目

java - 通过套接字传输时出现随机错误

JavaFx 在 Raspberry Pi 上非常慢

java - 难以理解递归

c++ - Eclipse c++11//vector

c# - 如何使用 ContinueWith 正确管理任务中的异常

c++ - 我可以从 `std::array` 派生一个类吗?