2015-04-14 82 views
0

我需要一些幫助爲我的項目選擇最佳線程模式。我想聽取來自java專家的意見和他們採取這一點。需要一些幫助在javafx應用程序中設置線程

該應用程序有一個設備列表,存儲在可觀察列表中。

  1. 應用程序初始化時,UI線程運行
  2. UI線程調用unitActiveTask線程啓動監控設備是否活躍,這一直運行在後臺。
  3. 用戶可以調用某些服務和任務,而其他2個線程運行。任務和服務(真的不知道有什麼區別服務和任務之間)
    • 刪除設備從列表
    • 上傳文件到設備(固件配置)(可能需要很長一段時間的 例子)
    • 產生配置(生成保持任意值屬性文件,需要1-5秒)
    • 其他一些類似的動作

您可以假設只有unitActiveTask不應該被阻塞。其他任務可以阻止用戶,直到他們完成。唯一應該始終保持響應的是ui,unitActiveTask可能會被暫停。

+0

你可以創建一個具體的問題嗎?目前尚不清楚你實際上在問什麼。 –

+0

問題是你將如何線程?也許一些鏈接到一些資源。因爲有這麼多的變種。任務,可運行程序,線程,執行程序等。然後有相關的數據結構,如阻塞隊列,期貨,鎖。 –

回答

0

這個問題可能對於這個論壇來說過於寬泛;然而,看看這是否足夠幫助:

A Task代表一個一次性任務,旨在運行在後臺線程。它可以返回一個值並可以拋出異常。它具有在FX應用程序線程上執行的回調方法(用於更新UI),這些回調方法在其生命週期中的各個點處調用,例如setOnSucceeded(...)setOnFailed(...)。此外,它還有各種更新FX應用程序線程屬性的方法update...(...)。每個Task實例只能執行一次。

A Service具有與Task類似的功能,但旨在可重複使用。因此,它有其他方法,如reset()restart()。它通過創建和管理Task實例(通過您需要實現的createTask()方法)並在一個或多個後臺線程上執行它們來工作。

A ScheduledServiceService,它可以在指定的時間間隔生成它的Task

對於您的情況:

項目2:因爲這是你的應用程序的持續運行一個線程,它是不適合的Task(其目的是執行和返回值)或Service (這實際上只是Task的集合)。爲此,您可以考慮使用ScheduledService定期輪詢設備,或者您可以簡單地創建一個線程並在後臺執行該線程。在後一種情況下,您應該在線程上調用setDaemon(true),以防止應用程序退出。如果您選擇Thread選項,則需要在FX應用程序線程上調用由線程中執行的代碼而需要對UI進行的任何更改,您可以通過調用Platform.runLater(...)來執行該更改。如果您使用ScheduledService,則可以使用服務上的回調方法或創建的任務執行此操作。

項目3:Create an Executor適合您的需求(或多個如果適用)。在觸發相應任務的事件處理程序中,創建一個任務,通過爲onSucceededonFailed(如有必要)設置處理程序來配置它,然後在執行程序中執行任務。如果適用,您可以在提交任務之前禁用部分UI。 onSucceeded處理程序可以重新啓用UI的這些部分以及處理任務的結果。