【发布时间】:2016-06-13 14:07:00
【问题描述】:
提供实时股票数据的第 3 方 API 正在为每个股票的每次价格更新创建一个新线程(代码部分如下)。
byte[] data = new byte[byteLength];
System.arraycopy(byteArray.toByteArray(), index, data, 0, data.length);
new Thread(new BrokerAPI.parseData(data)).start();
这每天会创建大约 250,000 多个线程(在 4 到 5 小时内),即使对于像我这样的新手来说,这看起来也是一个糟糕的设计。尽管价格正在更新,但我的程序在大约 2 小时后开始抛出 NullPointerException。我怀疑问题是由于生成了大量线程。
我需要监控的脚本总数约为 120,因此我正在寻找一种最多拥有 120 个线程的方法,其中每个价格更新都写入特定线程。
我参考了Link 中提供的解决方案(生产者/消费者模式),我认为它应该可以解决这个需求。请求有关如何将其转换为代码的指导,因为这是新手。或者,如果有任何其他方法可以用最少的线程数实现这一点,我会很高兴。
【问题讨论】:
-
如果您可以编辑源代码,请将新的 Thread 构造替换为委托给所需大小的线程池。此 API 受 CPU 限制,因此您创建的线程数不应超过内核数。
-
您是否有权编辑此第 3 方 API?如果没有,就没有什么可以做的了。如果可以的话,我建议阅读一下
Executors和ExecutorService
标签: java multithreading