2012-08-24 42 views
0

我有一個應用程序,我試圖重構使用MVC體系結構。 GUI啓動幾個長時間運行的函數調用,如果我沒有將它們從GUI線程中分離出來,它們會阻塞這個接口。在異步版本中包裝同步調用

現在我想知道是否將擁有如此長時間運行的函數的控制器對象包裝到只將當前調用分離到另一個版本的版本中會是一個好主意?這種問題有什麼模式嗎?

編輯 也許我應該提供一個樣本。目前,我的代碼充斥着如下:

env.getScheduledExecutor().execute(new Runnable() { 
    public void run() { 
    backend.someLongRunningMethod(); 
    } 
}); 

現在我不知道我是否應該換行Backend變得像一個BackendFacade類,將只是包裝任何函數調用到一個可運行的,並安排其遺囑執行人。

值得注意的是,大多數時候方法返回void或我不在乎。在少數情況下,我需要將價值返回,我只需使用Future。它不應該是一個巨大的變化,因爲我已經在某個時候解耦了線程,但我想鞏固整個項目中的工作方式。

回答

0

這聽起來很像某種異步調用。 通常不同的框架有不同的支持

@Async // Servlets/Springs does。圖形用戶界面應該也有這個

如果你的框架不允許這樣做,那麼我看不出有一個線程池做這個問題。

0

從同步去異步始終是一個激進的設計變化,因爲不是等待結果和效果拉,現在後臺任務需要結果到適當的地方。最後,這看起來很像其他Swing Listener。您可以創建自己的回調接口,該接口在傳遞給後臺任務的實例中實現。該任務將調用該實例的「結果就緒」方法,該方法將調用結果處理代碼。

還有SwingWorker類,但它沒有實現線程池。每個實例都將使用一個新線程。