2

我正在制作一个 Swing 应用程序,并且我有一个Runnable运行线程的类,并且该线程发出一个 HTTP 请求,知道线程何时完成的最佳方法是什么?

private void loginMouseClicked(java.awt.event.MouseEvent evt) {
    login.setEnabled(false);
    loading.setVisible(true);

    DoLogin log = new DoLogin(user.getText(), pass.getPassword().toString());
    Thread t = new Thread(log);
    t.start();

    loading.setVisible(false);
    login.setEnabled(true);
}

我想将该方法的最后两行移到另一个在线程完成时触发的方法。我怎样才能做到这一点?

4

4 回答 4

2

使用SwingWorker。在doInBackground()方法中进行登录,并将其他两行代码放入done()方法中。

这样做很重要,而不是简单地将要执行的附加操作添加到登录线程的末尾,或者为它们生成另一个线程,因为它们会更新您的 UI,因此您希望在 Swing UI 上执行它们线。SwingWorkerdone()方法将在 Swing UI 线程上调用。

于 2013-01-18T19:12:46.160 回答
0

您将一个任务 - 一个可运行的实现传递给要处理的线程。线程在处理此任务时完成。

您可以将回调侦听器传递给您的任务,它将在任务完成之前通知。

在 Do login 的构造函数中传递以下接口的实现

interface ICompletionListener {
void onCompletion();
}

在可运行的实现中调用该对象的 onCompletion;并在此接口的实现中执行代码的最后两行。

于 2013-01-18T19:09:48.520 回答
0

DoLogin Runnable可以实现一个侦听器,该侦听器将在该过程完成时执行。

有关如何创建自己的侦听器的更多详细信息,请参阅此答案。

于 2013-01-18T19:11:01.440 回答
0

好吧,以这种方式将您的包装DoLogin成新Runnable的:

Runnable r = new Runnable() {
    public void run() {
          DoLogin log = new DoLogin(user.getText(), pass.getPassword().toString());
          log.run();

          // placing here finishing stuff
          loading.setVisible(false);
          login.setEnabled(true);
    }
}
Thread t = new Thread(r);
t.start();
于 2013-01-18T19:12:09.830 回答