Java 8 的 Promise 實作,即CompletableFuture提供thenApply(...)和get()方法。
Whereget()會在必要時等待 Promise 完成,然后回傳其結果。
現在假設我們使用thenApply(...)(or thenApplyAsync(...)) 鏈接一些代碼以在 UI 執行緒上運行
(請參閱 stackoverflow.com/thenApply和 thenApplyAsync 之間的區別)。
如果我們也呼叫UI 執行緒會有什么行為get(),就像 Java 是否以某種方式處理這種情況,或者它會導致所謂的死鎖或無限回圈?
我之前使用的是 Qt 框架,根據我們如何實作服務員(dispatch-UI-events vs sleep),可以在同一個 UI 執行緒中等待 UI 執行緒(例如,整個視圖恢復了,并且沒有從我的代碼回傳)。
但我不確定 Java 是否支持這一點。
uj5u.com熱心網友回復:
呼叫get()會阻塞當前執行緒,直到結果可用。如果那是 UI 事件調度程式執行緒,那么您的應用程式的 UI 將變得無回應(阻塞)。
與 Qt 不同,Java 不支持手動處理 UI 事件,這意味著一旦您在 UI 執行緒上等待,其他任何東西都無法在 UI 執行緒上運行(直到服務員回傳)。
另外,不要破解 " thenApply(...)" 方法在 UI 執行緒上運行東西,因為有更好的解決方案,我的意思是使用thenApplyAsync(...)帶有Executoras 引數的版本。SaidExecutor是具有一種方法的功能介面,void execute(Runnable command). 您可以為此使用 EventQueue::invokeLater(或其包裝器SwingUtilities.invokeLater)。然后它將在事件調度程式執行緒(又名 UI 執行緒)上執行代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481889.html
下一篇:在c#中使用lock陳述句
