在我的应用程序中,我有4个线程向PriorityBlockingQueue
添加元素,并且有一个线程轮询元素。对于轮询线程,队列似乎无法访问。我假设我必须采取措施使其线程安全。
在我取出第一个元素后,我清除了队列,它应该被其他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();
}
}
}
}
答案 0 :(得分:0)
当您的消费者线程启动时,队列可能为空,因此size = 0并且run()将退出。 你必须要等待输入一个msg。 清除队列对我来说似乎没有意义? 如果要“关闭”使用者线程,请发送特殊的队列结束消息。 使用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();
}
}
}
}