我正在创建一个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);
}
我想将该方法的最后两行移动到另一个在线程完成时被触发的方法。我怎么能这样做?
答案 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();