我正在尝试使用 ExecutorService 线程池在 Java 中创建多线程应用程序。该应用程序基本上查询第三方服务以获取有关给定关键字的数据。由于我有很多关键字并且每个请求都需要一些时间来生成,我想并行查询服务。请求是通过 ServiceHandler 对象发出的,该对象负责身份验证和解析结果。
在我的初始实现中,我为每个关键字创建一个新的 Callable 并创建一个新的 ServiceHandler 对象来查询服务。出于某种原因,这比在所有 Callable 中共享单个 ServiceHandler 对象运行得更快。但是,对于大型输入数据集,我遇到了内存问题,因为它正在为每个输入关键字创建新对象。
有没有办法仍然使用 ExecutorService 但只为每个工作线程创建一个不同的 ServiceHandler 实例?例如,如果我有 1000 个关键字和 20 个线程的固定池,我只想为每个线程创建一个 ServiceHandler(总共 20 个),同时仍然为每个关键字创建一个 Callable(总共 1000 个)。
我尝试向每个 Callable 对象添加一个静态 ThreadLocal 对象,该对象在其 initialValue() 中返回一个新的 ServiceHandler ,但似乎只创建了一个 ServiceHandler ?我可以为此发布我的代码,但我什至不确定这是否是正确的方法。