【问题标题】:Java - Multithreading Issue with too many threadsJava - 线程过多的多线程问题
【发布时间】: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


【解决方案1】:

NullPointerExceptions 不是线程过多的直接结果,其他原因会中断并导致它们(可能与内存有关)。

你在某处创建了一个托管线程池

private static final ExecutorService executorService = Executors.newCachedThreadPool();

让它决定(重新)使用哪些线程,而不是创建自己的线程:

byte[] data = new byte[byteLength];
System.arraycopy(byteArray.toByteArray(), index, data, 0, data.length);
executorService.execute(new BrokerAPI.parseData(data))

【讨论】:

  • 谢谢。我将按照您的建议进行更改,并在明天的实时数据流会话期间进行测试。
  • 这肯定有助于减少创建线程的数量。但是在对 TableView 进行排序时,我仍然会收到 NullPointerException,这将作为一个单独的问题提出。谢谢
猜你喜欢
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2016-12-12
相关资源
最近更新 更多