2015-06-17 77 views
0

爲了保持GUI響應,有必要在與事件分派線程不同的線程上執行長時間運行的任務,例如數據庫訪問。 爲此,有兩個主要的選擇:創建一個SwingWorker並調用程序邏輯對象的方法(使它們交易安全!),或創建一個Thread類並將請求轉發給它(如此處所示:Java desktop - how to separate database access from the UI thread?)。 您認爲哪種方法和哪種方法是更好的方法,特別是從設計的角度來看?用於GUI應用程序線程化的最佳方法(Java,swing)

回答

1

您還可以使用SwingUtilities.invokeLater()

2

的問題很廣,沒有任何顯著上下文。

SwingWorker是「一般」我的,因爲它是簡單的首選解決方案,有多種方式可以與它進行交互(publish/processdonePropertyListener),並可以專門爲工作單元,不管是工作的重複單元或單個運行情況。

SwingWorker有侷限性,首先,它只允許同時運行10個同時工作人員,它使用一個Thread的池(爲了簡單起見),但它重用,但池是有限的到10,你無能爲力。如果您預計需要進行大量併發處理,這可能會成爲問題,但如果您只是「希望完成工作」而不關心某些工作是否排隊等待一段的時間。

使用一個Thread和隊列可以工作,再次假設您不介意一次只完成一項工作,而另一項任務可能會排隊一段時間。這種方法的複雜性在於設置回調過程,該過程可以使用類似於Observer PatternProducer/Consumer Pattern的方式將工作人員Thread的數據/結果返回到EDT環境中的UI,其方式足夠靈活,SwingWorker已經做了。

我的第一個想法是,專注於創建一個可以檢索數據的過程,而不用擔心併發或UI。一旦你可以建立它,你可以在它上面添加另一個併發的圖層,因爲並不是代碼的每個方面都可能關心爲UI獲取數據。

從那裏您可以設計訪問機制,您的UI代碼將根據您的需要使用這些訪問機制來訪問這兩個其他圖層。

這是所有的理論和整體問題的上下文將決定你可能遵循哪些路徑(或其組合)(數據庫是否支持併發訪問?你想多重/併發訪問還是你不在乎?等)。你可以嘗試和解耦你的代碼,這將允許你改變一個單獨的圖層,而不必(很大程度上)修改其他的圖層。

相關問題