线程完成后,如何通知主线程?

时间:2011-05-30 08:15:08

标签: java multithreading

我使用FTP原始命令将文件上传到FTP服务器,我启动了一个新线程,通过我的代码中的socket发送文件。当新启动的线程完成发送文件时我想向控制台输出一些消息,我怎样才能确保线程完成它的工作? 这是我的代码:

TinyFTPClient ftp = new TinyFTPClient(host, port, user, pswd);
ftp.execute("TYPE A");
String pasvReturn = ftp.execute("PASV");
String pasvHost = TinyFTPClient.parseAddress(pasvReturn);
int pasvPort = TinyFTPClient.parsePort(pasvReturn);
new Thread(new FTPFileSender(pasvHost, pasvPort, fileToSend)).start();

2 个答案:

答案 0 :(得分:9)

  

如何确保线程完成了它的工作?

你这样打电话给Thread.join()

...
Thread t = new Thread(new FTPFileSender(pasvHost, pasvPort, fileToSend));
t.start();

// wait for t to finish
t.join();

但请注意,Thread.join 阻止直到另一个线程完成。

更好的想法可能是将上传线程封装在UploadThread类中,该类在完成后执行一些回调。例如,它可以实现addUploadListener并在上传完成时通知所有此类侦听器。然后主线程将执行以下操作:

UploadThread ut = new UploadThread(...);
ut.addUploadListener(new UploadListener() {
    public void uploadComplete() {
        System.out.println("Upload completed.");
    }
});

ut.start();

答案 1 :(得分:2)

对于你想要做的事情,我看到至少有三种方法可以实现:

  • 您可以让上传线程自己打印日志消息或
  • 在其他一些帖子中,你可以join上传线程。使用这种方法,你可以在调用join之前做一些其他工作,否则在单独的线程中没有收获。
  • 您可以实现某种类型的侦听器,因此上传Thread会通知所有已注册的侦听器有关其进度的信息。这是最灵活的解决方案,也是最复杂的解决方案。