Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程完成事件_Java_Multithreading - Fatal编程技术网

Java线程完成事件

Java线程完成事件,java,multithreading,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

我正在制作一个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);
}

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

您将一个任务(runnable的实现)传递给要处理的线程。线程在处理此任务时完成

您可以向任务传递回调侦听器,它将在任务完成之前发出通知

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

interface ICompletionListener {
void onCompletion();
}

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

您的
DoLogin
Runnable
可以实现一个监听器,该监听器将在流程完成时执行


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

好吧,将您的
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();
使用一个。在
doInBackground()
方法中登录,并将另外两行代码放入
done()
方法中


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

这正是创建
SwingWorker
的目的。我是否扩展我的DoLogin类?还是我的JFrame课程?