提供实时库存数据的第三方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中提供的解决方案(生产者/消费者模式),我认为应该解决这个问题。请求指导我如何将其转换为代码,因为我是新手。或者,如果有任何其他方法可以用最少的线程实现这一点,那就很高兴。
答案 0 :(得分:4)
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))