gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:26:08 24 4
gpt4 key购买 nike

我刚刚自己解决了这个问题。由于对话框关闭事件问题,我多次调用 syncCustomers() 。我通过在 JDialog 构造函数中提供父 JFrame 来解决它。我这边的错误非常愚蠢。

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

于是我想到了:

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

用户点击按钮开始同步过程:

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 之类的东西工作。 :(

最佳答案

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

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

关于java - 为什么这个线程连续运行多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15023040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com