2012-01-19 27 views
1

我已經構建了一個連接到數據庫的桌面應用程序,功能是添加 - 刪除 - 修改。我將它與3 JInternalFrame分開。如何實現一個線程到我的自制桌面應用程序

現在的問題是,當我執行批量更新來更新> 500個訂單時,我的應用程序將掛起,但它正在處理請求。然後我會再次運行這個應用程序,所以現在我有2個窗口打開相同的應用程序。第一個應用程序完成工作後,我可以再次使用以前的應用程序。

現在我的問題是,如何實現線程到我的應用程序,以便我可以在同一個窗口應用程序中運行多個功能?

回答

0

看看Swing Threads

特別是在:

SwingUtilities.invokeLater() 
0

我只是用:

new Thread(new Runnable() 
{ 
    public void run() 
    { 
     //Things to do in new thread... 
    } 
}).start(); 

或者,如果你想經常使用,可以使一個實現Runnable接口的類,所以你不必重寫一切都在run()函數中。

1

多線程Java中現在是很簡單的通過添加[java.util.concurrent.][1]

你需要做的是

  1. 分裂500個工作訂單爲較小的批次,說10每批次。
    1. 創建一個帶有配置線程數的線程池,比如10個線程。
    2. 創建一個可運行/可調用任務將從一個共同的地方拿起這些批處理並對數據庫執行CRUD操作。
    3. 您還需要一個通用的數據結構,它將具有這些CRUD操作的結果。所以一旦Runnable接口/調用任務完成它的操作,更新與操作的結果這個數據結構
    4. 還要記住的是,獲得這些數據結構 - 保存批處理作業的一個訂單 - 應保持操作結果 的同步。

對於線程池可以使用的

Executors.newFixedThreadPool or Executors.newCachedThreadPool() 
0

一個你應該做的是從你的數據庫訪問和修改類獨立的UI類。然後,您可以從您的用戶界面,你可以調用像這樣:但是

new Thread(new Runnable() 
{ 
    public void run() 
    { 
     //Call database stuff here 
    } 
}).start(); 

注意,即具有在同一時間去了很多數據庫操作可能導致錯誤特別是因爲數據庫可能會鎖定表到它正在閱讀/寫入。我建議你一次只保留一個操作,並使用線程來顯示選取框進度條或類似的東西。

+0

嗨npinti,感謝您的回覆,我想我會去JB Nizet建議,因爲當我讀到關於擺動併發,我覺得我沒有履行這一規則。因此,當我執行長時間任務時,我的應用程序被凍結。 – lagunaloire

2

長時間運行的任務(如批量更新)不能在事件調度線程來完成(其中所有的GUI操作由線程),否則,當你觀察到的,GUI凍結。

使用SwingWorker在後臺線程中執行長時間運行的任務。它的javadoc有一個有用的例子,其中也描述了Swing tutorial

+0

Hi HB Nizet,感謝您的建議。讀完教程後,如何製作初始線程,事件分派線程或工作線程? – lagunaloire

+1

如果您還沒有從教程中瞭解這一點,請重新閱讀它。初始線程是執行主方法的主線程。 EDT是調用SwingUtilities.invokeLater(...)從主方法創建並顯示GUI時自動創建的線程。工作線程是SwingWorker爲您創建的工作線程。仔細閱讀** **。 –

+0

是的,你說我沒有仔細閱讀它......好吧,讓我更多地挖掘它。 – lagunaloire

相關問題