2013-02-22 97 views
2

我剛剛自己解決了這個問題。由於對話關閉事件問題,我有多次調用syncCustomers()。我通過在JDialog構造函數中提供父JFrame來解決它。非常愚蠢的錯誤在我身邊。爲什麼這個線程連續多次運行?

我的應用程序包含一個與web服務和本地數據庫同步的任務。此任務可能需要幾分鐘的時間。因此我想通過一個簡單的對話框(Swing)通知用戶這個耗時的過程。在同步過程運行時,用戶不應該繼續工作。

於是我想到的:

  1. 開模態對話框,用戶
  2. 通知開始同步過程中的一個單獨的線程同步過程完成
  • 接近模態對話框

    用戶點擊按鈕開始同步過程:

    private void syncCustomers() { 
        if (checkWebserviceAuth()) { 
    
         SyncDialog dialog = new SyncDialog(); 
         dialog.setLocationRelativeTo(this); 
         dialog.setVisible(true); 
    
         SyncCustomersTask task = new SyncCustomersTask(dialog, getCoach()); 
         task.run(); // task.start() will result in the same problem 
    
        } else { 
         openAuthorizeDialog(true); 
        } 
    } 
    

    public class SyncDialog extends javax.swing.JDialog { 
    
        public SyncDialog() { 
         initComponents(); 
         // I already noticed that the modal dialog won't work for me since it interrupts within syncCustomers() 
         //this.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); 
    
         this.setTitle(Application.getApplicationTitle()); 
        } 
    
        ... 
    
    } 
    

    public class SyncCustomersTask extends Thread { 
    
        private void doWork() { 
         System.out.println("Start doWork() and sleep for 10 seconds..."); 
         try { 
          // for testing purpose 
          Thread.sleep(10000); 
         } catch (InterruptedException ex) { 
         } 
         System.out.println("Done with doWork()."); 
        } 
    
        @Override 
        public void run() { 
         doWork(); 
         if (getCallback() != null) { 
          System.out.println("Invoke callback..."); 
          getCallback().dispose(); 
          System.out.println("Callback invoked."); 
         } 
        } 
    
        ... 
    } 
    

    這將導致一個無限循環:

    Start with doWork()... 
    Start doWork() and sleep for 10 seconds... 
    Done with doWork(). 
    Invoke callback... 
    Callback invoked. 
    

    如果我註釋掉

    getCallback().dispose(); 
    

    ,循環將第二次執行後停止:

    Start with doWork()... 
    Start doWork() and sleep for 10 seconds... 
    Done with doWork(). 
    Invoke callback... 
    Callback invoked. 
    Start with doWork()... 
    Start doWork() and sleep for 10 seconds... 
    Done with doWork(). 
    Invoke callback... 
    Callback invoked. 
    

    我不明白這一點。什麼引發線程一遍又一遍地執行?

    我想這整個事情不是一個好主意,但我無法得到像ProgressMonitor一樣的工作。 :(

  • +0

    是什麼getCallback()返回? – 2013-02-22 13:07:28

    回答

    2

    呼叫start(),不run(),後者將只執行線程,但在一個單獨的線程不!該start()方法實例化一個新的線程,然後才調用你的run()方法在新的線程。

    這是一個令人驚訝的常見的問題,順便說一句。

    +0

    不幸的是,這並沒有改變任何東西。 – Alex 2013-02-22 11:40:24

    0

    調用的run()在一個新的線程不執行代碼。