动态创建消费者

时间:2011-01-11 18:48:11

标签: java multithreading

我已经实现了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)??

之后我获得了一个空闲内存,我怎么知道我需要多少消费者(线程)来计算一个巨大文件的解析?我可以用哪种数学公式来创建必要的线程?

感谢..

4 个答案:

答案 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();