Java线程完成事件

时间:2013-01-18 19:05:56

标签: java multithreading

我正在创建一个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 个答案:

答案 0 :(得分:2)

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

以这种方式执行它很重要,而不是简单地添加其他操作以执行到登录线程的末尾,或者为它们生成另一个线程,因为它们更新了UI,因此您希望在Swing UI线程。将在Swing UI线程上调用SwingWorker的{​​{1}}方法。

答案 1 :(得分:0)

您传递一个任务 - 一个runnable实现到要处理的线程。线程在处理此任务时完成。

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

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

interface ICompletionListener {
void onCompletion();
}

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

答案 2 :(得分:0)

您的DoLogin Runnable可以实现在流程完成时执行的侦听器。

有关如何创建自己的监听器的详细信息,请参阅this answer

答案 3 :(得分: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();