我刚刚解决了这个问题。由于对话框关闭事件问题,我有多次调用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);
}
}
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 :(得分:2)
致电start()
,而不是run()
。后者只是执行线程,但不是在一个单独的线程中! start()
方法将实例化一个新线程,然后才在该新线程中调用您的run()
方法。
这是一个令人惊讶的常见问题,顺便说一句。
答案 1 :(得分:0)
调用 run()不会在新线程中执行代码。