【发布时间】:2018-12-14 20:18:56
【问题描述】:
我正在尝试在 Java 11 中实现一个简单的生产者/消费者系统。基本上,我为每个线程使用两个线程,外加一个全局队列,如下所示:
- 一个全局优先级队列。
- 第一个线程生产者运行 HTTP 服务器,监听传入的 http 消息,并在收到消息后,
pushes将其作为队列的作业(queue.size递增) - 第二个线程,消费者,不断
peeks队列。如果有作业 (job ! = null),则在某处提交 HTTP 请求,并在成功接收后,从队列中轮询它(queue.size()递减)。
骨架如下:
主类:
public class Manager
{
private Consumer consumer;
private Producer producer;
Queue queue;
public static void main (String args[])
{
consumer = new Consumer();
producer = new Producer();
}
}
生产者类:
public class Producer implements Runnable
{
public Producer()
{
Thread producer = new Thread(this);
producer.start();
}
public void run()
{
//HTTP server starts, listens, and adds to the queue upon receiving a Job
server.start();
Manager.queue.add(new Job());
}
}
消费类:
public class Consumer implements Runnable
{
public Consumer()
{
Thread consumer = new Thread(this);
consumer.start();
}
public void run()
{
// Thread.sleep(1);
while(true)
{
//get an object off the queue
Job job= Manager.queue.peek();
//do some stuff with the object
}
}
}
Producer 和 queue 可以正常工作。但问题在于Consumer。上面的消费者代码(带有while(true) 循环)不会窥视该项目。但是当我在while(true) 循环之前添加Thread.sleep(x) 时,即使x=1 ms,它也可以工作,并成功抓取项目。
有什么问题?从理论上讲,while(true) 循环应该不是问题!为什么它看不到和peek这个项目?!
【问题讨论】:
-
你用什么初始化
queue? -
队列最初是空的。大小只有 2000。
-
不幸的是,这对我没有帮助。你用什么类来初始化
queue?能贴出完整代码吗? -
static PriorityQueue<Job> jobSubmissionQueue -
PriorityQueue不是线程安全的。您可以使用PriorityBlockingQueue代替它,它是 线程安全的。
标签: java multithreading queue polling producer-consumer