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

问题描述

| 我使用FTP原始命令将文件上传到FTP服务器,我启动了一个新线程通过我的代码中的套接字发送文件。当新启动的线程完成发送文件后,我想向控制台输出一些消息时,如何确定线程已完成工作? 这是我的代码
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();
    

解决方法

           如何确定线程已完成工作? 您确实这样称呼
Thread.join()
...
Thread t = new Thread(new FTPFileSender(pasvHost,pasvPort,fileToSend));
t.start();

// wait for t to finish
t.join();
但是请注意,
Thread.join
将阻塞,直到另一个线程结束。 一个更好的主意可能是将上载线程封装在
UploadThread
类中,该类完成后将执行一些回调。例如,它可以实现一个“ 5”并在上传完成时通知所有此类侦听器。然后,主线程将执行以下操作:
UploadThread ut = new UploadThread(...);
ut.addUploadListener(new UploadListener() {
    public void uploadComplete() {
        System.out.println(\"Upload completed.\");
    }
});

ut.start();
    ,        对于您正在尝试做的事情,我至少看到三种实现方法: 您可以让上传线程自己打印日志消息,或者 在其他线程中,您可以加入上传线程。使用这种方法,您可以在调用
join
之前做一些其他工作,否则在单独的线程中执行此操作不会有任何好处。 您可以实现某种侦听器,因此上传
Thread
会通知所有已注册的侦听器其进度。这是最灵活的解决方案,也是最复杂的解决方案。