簡體   English   中英

如何為我的自制桌面應用程序實現線程

[英]How to implement a thread to my home-made desktop application

我已經建立了一個連接數據庫的桌面應用程序,功能是添加-刪除-修改。 我將其與3 JInternalFrame分開。

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

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

長時間運行的任務(例如批量更新)一定不能在事件分發線程(進行所有GUI操作的線程)中完成,否則,正如您所觀察到的,GUI凍結了。

使用SwingWorker在后台線程中執行長時間運行的任務。 它的javadoc有一個有用的示例,在Swing教程中也有描述。

現在,通過添加[java.util.concurrent.][1] ,java中的多線程非常簡單[java.util.concurrent.][1]

您需要做的是

  1. 將500個工作訂單分成較小的批次,例如每批次10個。
    1. 使用配置的線程數(例如10個線程)創建一個線程池。
    2. 創建一個Runnable / callable任務,該任務將從一個公共位置提取這些批處理並在數據庫上執行CRUD操作。
    3. 您還需要一個通用的數據結構,該結構將具有這些CRUD操作的結果。 因此,一旦Runnable / callable任務完成操作,它將使用操作結果更新此數據結構
    4. 還要記住,對這些數據結構的訪問(一個保存一批作業單)和一個保存操作結果的訪問應該同步。

對於線程池,您可以使用以下之一

Executors.newFixedThreadPool or Executors.newCachedThreadPool()

看一下Swing Threads

特別是在:

SwingUtilities.invokeLater()

我只是用:

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

或者,如果您想經常使用它,則可以使實現Runnable的類成為可能,因此您不必重寫run()函數中的所有內容。

您應該做的是將UI類與數據庫訪問和修改類分開。 然后,您可以從用戶界面中調用類似以下內容的代碼:

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

但是請注意,同時進行大量數據庫操作會導致錯誤,特別是因為數據庫可能會鎖定當前正在對其進行讀取/寫入的表。 我建議您一次將其保留一個操作,然后使用線程顯示選取框進度欄或類似內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM