1

在我的应用程序中,我有 4 个线程将元素添加到 aPriorityBlockingQueue和一个线程轮询元素。对于轮询线程,队列似乎不可访问。我认为我必须采取措施使其线程安全。

在我取出第一个元素后,我清除了队列,它应该被其他 4 个填充线程再次填充。

轮询和填充线程在同一个类中,该类包含PriorityBlockingQueue.

这是投票的代码:

private class UPPainter implements Runnable {
    @Override
    public void run() {
        while(queue.size() > 0) {
            ReceivedMsg msg = queue.poll();
            queue.clear();
            for(final IPacketListener c : listeners) {
                new Thread(new ListenerUp(c, msg)).start();
            }
        }
    }
}
4

1 回答 1

0

当您的消费者线程启动时,队列可能为空,因此 size = 0 和 run() 将退出。您实际上必须等待输入消息。清除队列对我来说似乎没有意义?如果要“关闭”消费者线程,请发送特殊的队列结束消息。使用 queue.take() 实际阻塞,直到插入元素:

private class UPPainter implements Runnable {  
    @Override  
    public void run() {  
        while(true) {  
            ReceivedMsg msg = queue.take();  
            for(final IPacketListener c : listeners) {  
                new Thread(new ListenerUp(c, msg)).start();  
            }  
        }  
    }  
}
于 2012-10-17T10:08:36.920 回答