2017-03-18 76 views
0

ThreadLocal將數據綁定到特定的線程。對於CompletableFuture,它使用來自線程池的線程執行,該線程可能是不同的線程。與CompletableFuture一起使用ThreadLocal是否安全?

這是否意味着當CompletableFuture被執行時,它可能無法從ThreadLocal中獲取數據?

+1

是的,確切地說。除非你準備你自己的線程池,每個線程攜帶所需的ThreadLocal變量。 –

+0

@AlexeiKaigorodov如果我使用thenApply而不是thenApplyAsync,那麼這會保證我總是可以在同一個線程中執行嗎?所以我可以使用ThreadLocal來存儲/讀取數據。 – franziga

+1

不能保證在哪個線程上執行應用程序。如果您想訪問一些常用數據,請將該數據放在類變量中,然後使用該類的方法作爲thenApply()的參數。 –

回答

0

是的,斯卡拉期貨有Local.scala,通過thenCompose/thenApply方法(即flatMap/map方法)傳遞狀態。 Java真的很缺乏,它使得平臺開發人員非常努力地創建一個平臺,將平臺狀態傳遞給客戶端代碼,然後再調用回平臺。這很令人沮喪,但斯卡拉的功能太多了(它就像廚房的水槽),所以儘管簡潔,但我發現項目越來越失控,因爲人類(包括我)都傾向於做出不同的選擇。

相關問題