【发布时间】:2016-11-20 09:57:10
【问题描述】:
我希望 ProducerThread 产生最多 10 个随机值,然后期望 ConsumerThread 使用 Queue 的这些值。某处 Producer 不止一次地生成添加值。我有一个概念,当我们在一个对象上调用 notify 时,该 Thread 将释放锁定并为期待更新的 Thread 提供机会。
这是代码,请纠正我的理解。
public class ProducerThread extends Thread {
Queue<Integer> values;
ProducerThread(Queue<Integer> values) {
this.values = values;
}
public void run() {
while(true) {
synchronized(values) {
double totalValues = Math.random()*10;
System.out.println("Going to populate total values:" + totalValues);
for (int i = 1; i <= totalValues; i++) {
values.add(i);
System.out.println("Value updated: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
values.notify();
}
}
}
}
public class ConsumerThread extends Thread {
Queue<Integer> values;
ConsumerThread(Queue<Integer> values) {
this.values = values;
}
@Override
public void run() {
while(true) {
synchronized (values) {
try {
// Consumer Thread waits until values are populated by Producer Thread
if(values.isEmpty()) {
values.wait();
}
Iterator<Integer> iterateValues = values.iterator();
System.out.println("Going to consume values: " + values.size());
while (iterateValues.hasNext()) {
Integer removedValue = iterateValues.next();
System.out.println("Value deleted: " + removedValue);
}
values.clear();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class Test {
public static void main(String[] args) {
Queue<Integer> values = new LinkedList<Integer>();
ProducerThread producer = new ProducerThread(values);
ConsumerThread consumer = new ConsumerThread(values);
consumer.start();
producer.start();
}
}
【问题讨论】:
-
我刚刚运行了它,它正在做我读到的它应该做的事情。您能否准确说明您的期望?也许是样本输出?
-
@JoeC 我希望可能的输出为:生产者设置随机值 8,然后一旦生产者完成,它应该从 1 到 8 个值填充队列,消费者将清除所有 8 个值。然后生产者再次将随机值设置为 5,并将队列从 1 填充到 5,然后轮到消费者。
-
你不会找到任何现成的解决方案来让两个(或更多)线程轮流,因为这不是线程的用途。一组线程可以轮流做的任何事情都可以通过单个线程更有效地完成。如果这是一项家庭作业,并且您必须让线程轮流进行,那么我将为每个线程创建一个
java.util.concurrent.SynchronousQueue。每个线程在其队列中等待接收“令牌”(对象)。当它得到令牌后,它会做一些工作,然后将令牌放入下一个线程的队列中,然后再次返回等待。
标签: java multithreading producer-consumer