Java 为什么这个线程连续运行多次?

Java 为什么这个线程连续运行多次?,java,multithreading,infinite-loop,runnable,Java,Multithreading,Infinite Loop,Runnable,我只是自己解决了这个问题。由于对话框关闭事件问题,我多次调用syncCustomers()。我通过在JDialog构造函数中提供父JFrame解决了这个问题。我犯了一个相当愚蠢的错误。 我的应用程序包含一个与Web服务和本地数据库同步的任务。此任务可能需要几分钟的时间。因此,我想通过一个简单的对话框(Swing)通知用户这个耗时的过程。同步进程正在运行时,用户不应继续工作 于是我想到: 打开带有用户通知的模式对话框 在单独的线程中启动同步进程 同步过程完成后关闭模式对话框 用户单击按钮以启动同

我只是自己解决了这个问题。由于对话框关闭事件问题,我多次调用syncCustomers()。我通过在JDialog构造函数中提供父JFrame解决了这个问题。我犯了一个相当愚蠢的错误。

我的应用程序包含一个与Web服务和本地数据库同步的任务。此任务可能需要几分钟的时间。因此,我想通过一个简单的对话框(Swing)通知用户这个耗时的过程。同步进程正在运行时,用户不应继续工作

于是我想到:

  • 打开带有用户通知的模式对话框
  • 在单独的线程中启动同步进程
  • 同步过程完成后关闭模式对话框

  • 用户单击按钮以启动同步过程:

    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);
        }
    }
    



    这将导致无限循环:

    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这样的东西工作起来(

    调用
    start()
    ,而不是
    run()
    。后者只执行线程,但不在单独的线程中执行。
    start()
    方法将实例化一个新线程,然后才在该新线程中调用
    run()
    方法


    顺便说一句,这是一个令人惊讶的常见问题。

    调用run()不会在新线程中执行代码。

    不幸的是,这不会改变任何东西。getCallback()返回什么?
    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.