我已经实现了java版的Producer&& java和我的消费模式已经注意到我的解决方案是一种静态方式!!
我在主要测试中有代码,比如我有1个Producer(读取一个文件块并将其放入缓冲区)和许多* consumer(来自缓冲区保留块)在示例4中:
Producer master= new Producer();
Consumer one= new Consumer();
Consumer two= new Consumer();
Consumer three= new Consumer();
Consumer four= new Consumer();
master.start();
one.start();
two.start();
three.start();
four.start();
让我们来ROCCccccck ..
所以一切都好,但是,我想实现一种动态方式,在所有开始之前建立消费者的数量......如果我计算java代码??:
long usableFreeMemory= Runtime.getRuntime().maxMemory()-Runtime.getRuntime().totalMemory()
+Runtime.getRuntime().freeMemory();
我获得了JVM的空闲内存?或者计算机的空闲内存(RAM)??
之后我获得了一个空闲内存,我怎么知道我需要多少消费者(线程)来计算一个巨大文件的解析?我可以用哪种数学公式来创建必要的线程?
感谢..
答案 0 :(得分:2)
作为创建消费者数量的策略,我建议您检查Runtime.availableProcessors()。此方法将告诉您“...... Java虚拟机可用的处理器数量。” (来自JavaDoc)。我认为这是最好的方法,因为如果你有更多的消费者而不是可用的处理器,那么任何过去的消费者将不得不等待另一个消费者进入睡眠状态,因此无论如何你实际上都有numProcessors消费者。
for(int i=0;i<Runtime.numProcessors();i++){
new Consumer().start();
}
当然,如果你的程序是分发的,你可以为每台机器上的每个处理器启动一个消费者。
答案 1 :(得分:1)
通过内存检查,您可以获得JVM的内存,所以这很好。加载操作系统的内存值对您的目的没有意义。
消费者是否总是这样做,或者只是执行它提供的任何Task / Runnable?如果它始终相同,那么您可以对每个消费者需要的内存进行基准测试,并根据该数据计算线程数量。否则,您需要动态检查每个线程使用的内存,并根据JVM中的可用空间决定启动另一个线程是否明智。
当然,它不仅关于内存,还关乎CPU。因此,您可能有足够的内存来生成新的线程,但如果CPU没有更多的免费资源,那么您将遇到性能问题。
您还可以查看Java Excecutor界面及其实现,它们可能对生产者/消费者模式非常方便。
答案 2 :(得分:0)
如果您希望创建动态数量的生产者或消费者,为什么不直接向程序添加命令行参数以指定其各自的数字,并解析它们?我不会尝试使用一些基于可用内存的启发式方法,因为这可能会因各种平台而异。
答案 3 :(得分:0)
一旦你知道你想要多少消费者就可以把它们放在一个数组中
int consumerCount =
Consumer[] consumers = new Consumer[consumerCount];
for(int i=0;i<consumerCount;i++)
consumer[i] = new Consumer();
for(Consumer consumer: consumers) consumer.start();
for(Consumer consumer: consumers) consumer.stop();