我正嘗試使用ExecutorService線程池在Java中創建多線程應用程序。該應用程序基本上查詢第三方服務的關於給定關鍵字的數據。由於我有很多關鍵字,每個請求都需要一些時間來生成,所以我想要並行查詢服務。這些請求是通過ServiceHandler對象完成的,該對象負責認證並解析結果。在線程池中的任務之間但不是在Java線程之間共享對象
在我最初的實現中,我爲每個關鍵字創建一個新的Callable,並創建一個新的ServiceHandler對象來查詢服務。由於某些原因,這比在所有Callable上共享一個單例ServiceHandler對象的速度更快。但是,對於大量輸入數據集,我遇到了內存問題,因爲它爲每個輸入關鍵字創建新對象。
有沒有辦法仍然使用ExecutorService,但只爲每個工作線程創建一個不同的ServiceHandler實例?例如,如果我有1000個關鍵字和20個線程的固定池,我只想爲每個線程創建一個ServiceHandler(共20個),同時每個關鍵字仍然有一個Callable(總計1000個)。
我試圖向每個在其initialValue()中返回一個新的ServiceHandler的Callable對象添加一個靜態的ThreadLocal對象,但是似乎只有一個ServiceHandler正在創建?我可以發佈我的代碼,但我甚至不確定這是否是正確的方法。
我試過了,並在ServiceHandler中添加了一個新的static volatile instanceCount變量。當我在ServiceHandler的構造函數中增加該變量並將其打印出來時,我總是得到1,這看起來像我只創建一個實例? – Yiling