這個問題可能對於這個論壇來說過於寬泛;然而,看看這是否足夠幫助:
A Task
代表一個一次性任務,旨在運行在後臺線程。它可以返回一個值並可以拋出異常。它具有在FX應用程序線程上執行的回調方法(用於更新UI),這些回調方法在其生命週期中的各個點處調用,例如setOnSucceeded(...)
和setOnFailed(...)
。此外,它還有各種更新FX應用程序線程屬性的方法update...(...)
。每個Task
實例只能執行一次。
A Service
具有與Task
類似的功能,但旨在可重複使用。因此,它有其他方法,如reset()
和restart()
。它通過創建和管理Task
實例(通過您需要實現的createTask()
方法)並在一個或多個後臺線程上執行它們來工作。
A ScheduledService
是Service
,它可以在指定的時間間隔生成它的Task
。
對於您的情況:
項目2:因爲這是你的應用程序的持續運行一個線程,它是不適合的Task
(其目的是執行和返回值)或Service
(這實際上只是Task
的集合)。爲此,您可以考慮使用ScheduledService
定期輪詢設備,或者您可以簡單地創建一個線程並在後臺執行該線程。在後一種情況下,您應該在線程上調用setDaemon(true)
,以防止應用程序退出。如果您選擇Thread
選項,則需要在FX應用程序線程上調用由線程中執行的代碼而需要對UI進行的任何更改,您可以通過調用Platform.runLater(...)
來執行該更改。如果您使用ScheduledService
,則可以使用服務上的回調方法或創建的任務執行此操作。
項目3:Create an Executor
適合您的需求(或多個如果適用)。在觸發相應任務的事件處理程序中,創建一個任務,通過爲onSucceeded
和onFailed
(如有必要)設置處理程序來配置它,然後在執行程序中執行任務。如果適用,您可以在提交任務之前禁用部分UI。 onSucceeded
處理程序可以重新啓用UI的這些部分以及處理任務的結果。
你可以創建一個具體的問題嗎?目前尚不清楚你實際上在問什麼。 –
問題是你將如何線程?也許一些鏈接到一些資源。因爲有這麼多的變種。任務,可運行程序,線程,執行程序等。然後有相關的數據結構,如阻塞隊列,期貨,鎖。 –