java - 动态创建Consumer

标签 java multithreading

我已经在java中实现了一个java版本的生产者&&消费者模式,我注意到我的解决方案是静态的!!

准确地说,我在主测试中拥有代码,例如示例 4 中我有 1 个生产者(读取文件的一大块并将其放入缓冲区)和许多*消费者(从缓冲区保留 block ):

 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)??

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

谢谢..

最佳答案

作为创建消费者数量的策略,我建议您检查 Runtime.availableProcessors()。这个方法会告诉你“...Java虚拟机可用的处理器数量”。 (来自 JavaDoc)。我将此作为最佳方法提交,因为如果您的消费者多于可用处理器,那么超过该点的任何消费者都必须等待另一个消费者进入休眠状态才能进入休眠状态,因此无论如何您实际上都有 numProcessors 消费者。

for(int i=0;i<Runtime.numProcessors();i++){
  new Consumer().start();
}

当然,如果您的程序是分布式的,您可以为每台机器上的每个处理器启动一个消费者。

关于java - 动态创建Consumer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4661403/

相关文章:

java 无法从我的 jtable 中的 sql server 检索数据

java - ArrayList 的并发线程和后续问题

java - 如何在单线程中使用多个可运行接口(interface)?

.net - 从某个线程调用方法时"Unable to evaluate expression because the code is optimized"

java - 如何使用自定义 ConstraintValidator 将 ConstraintViolations 添加到索引 i 处的列表元素

java - 使用 try and catch 请求 Android 运行时权限

java - Android Java 分为 4 个整数

python - LED闪烁如何打发时间。 sleep RPI

c# - 线程安全单例 : why the memory model does not guarantee that the new instance will be seen by other threads?

java - java中放置组件用什么方法比较方便?