在Java(tm)教程中关注this example之后,我实现了这个基本的生成器 - Delphi 2009中的一个消费者应用程序(引入了对象锁)。
现在我想扩展它,以便多个消费者线程从Drop实例接收消息。与Java教程示例相比,唯一的代码更改将在main方法中:
public class ProducerConsumerExample {
public static void main(String[] args) {
Drop drop = new Drop();
(new Thread(new Producer(drop))).start();
(new Thread(new Consumer(drop))).start();
(new Thread(new Consumer(drop))).start(); // <--- added
(new Thread(new Consumer(drop))).start(); // <--- added
}
}
因此Drop类仍然会有一个String类型的消息对象,所有正在运行的消费者将竞争访问锁,并处理消息数据。
此代码更改会引入风险,还是使用安全?
答案 0 :(得分:0)
根据链接示例的代码,您将无法阻止多个消费者。
因此,您需要将stop()
方法添加到消费者类,或者发布DONE
消费者的次数。
除此之外,没有风险。
但是如果你希望提高生产者 - 消费者的吞吐量,你可以考虑使用当时可以容纳多个值的类 - 某种类型的队列,例如来自JDK的BlockingQueue
。这样,您的生产者和消费者就不会像在此代码示例中那样经常被阻止。