2013-02-22 99 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()在一个新的线程不执行代码。