gpt4 book ai didi

java - 在线程池中的任务之间共享对象,但在 Java 中的线程之间不共享对象

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:20 25 4
gpt4 key购买 nike

我正在尝试使用 ExecutorService 线程池在 Java 中创建多线程应用程序。该应用程序基本上查询第三方服务以获取有关给定关键字的数据。由于我有很多关键字,并且每个请求都需要一些时间来生成,因此我想并行查询服务。请求是通过 ServiceHandler 对象发出的,该对象负责身份验证并解析结果。

在我的初始实现中,我为每个关键字创建一个新的 Callable,并创建一个新的 ServiceHandler 对象来查询服务。由于某种原因,这比在所有 Callable 之间共享单个 ServiceHandler 对象运行得更快。但是,对于大型输入数据集,我遇到了内存问题,因为它为每个输入关键字创建新对象。

有没有办法仍然使用 ExecutorService 但只为每个工作线程创建一个不同的 ServiceHandler 实例?例如,如果我有 1000 个关键字和 20 个线程的固定池,我只想为每个线程创建一个 ServiceHandler(总共 20 个),同时仍然为每个关键字创建一个 Callable(总共 1000 个)。

我尝试向每个 Callable 对象添加一个静态 ThreadLocal 对象,该对象在其initialValue() 中返回一个新的 ServiceHandler ,但似乎只创建了一个 ServiceHandler ?我可以为此发布我的代码,但我什至不确定这是否是正确的方法。

最佳答案

是的,有一种方法可以为每个线程仅创建一个对象实例,您应该使用 ThreadLocal<ServiceHandler>并将其声明为静态字段。这将为每个线程仅创建一个对象实例。您可以查看http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html这是官方文档。

关于java - 在线程池中的任务之间共享对象,但在 Java 中的线程之间不共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17354212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com