Java/PriorityQueue和线程

Java/PriorityQueue和线程,java,multithreading,thread-safety,priority-queue,Java,Multithreading,Thread Safety,Priority Queue,在我的应用程序中,有4个线程向PriorityBlockingQueue添加元素,一个线程轮询其中的元素。对于轮询线程,队列似乎不可访问。我想我必须采取措施保证线程安全 在获取第一个元素后,我清除了队列,它应该被其他4个填充线程再次填充 轮询线程和填充线程位于同一个类中,该类包含优先级BlockingQueue 这是轮询的代码: private class UPPainter implements Runnable { @Override public void run() {

在我的应用程序中,有4个线程向
PriorityBlockingQueue
添加元素,一个线程轮询其中的元素。对于轮询线程,队列似乎不可访问。我想我必须采取措施保证线程安全

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

轮询线程和填充线程位于同一个类中,该类包含
优先级BlockingQueue

这是轮询的代码:

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();
            }
        }
    }
}

当使用者线程启动时,队列可能为空,因此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();  
            }  
        }  
    }  
}

犯错误为什么在没有实际阻塞的情况下轮询PriorityBlockingQueue?为什么在收到一个元素后要清除它?这段代码有点…奇怪。我得到的数据包的频率是10Hz,但无法在这些频率下处理它们,所以我将它们存储在队列中进行比较,然后轮询重要的数据包。在得到一个线程后,它将被处理(需要2秒),我将清除队列(将再次被其他线程填满)。。。问题是应该如何进行阻塞?哦,不,似乎you是对的,if子句起了作用。我清除队列是因为它被填满的速度比从队列中取出的速度快得多(并且在通过
new Thread(new ListenerUp(c,msg))处理消息的过程中)。start()
我不需要将“旧”消息存储在queue.hmm中,那么您就根本不需要循环。Simple queue.take();queue.clear();