Non so se ho interpretato bene le tue parole... Ho provato a fare così:
codice:
public class MyThread extends Thread{
        String msg;
        JTextField tf;

        public void MyThread(){
            start();
        }

        public MyThread(String s,JTextField t){
            msg=s;
            tf=t;
            start();
        }


        public void run(){
            System.out.println("prova");
            tf.setText(msg);
        }
    }

metodo upload della classe FileUpload:

public void upload( String ftpServer, String user, String password,String fileName, File source,JTextField tLoading ) throws MalformedURLException,IOException,InterruptedException{

        if (ftpServer != null && fileName != null && source != null){
            System.out.println("Connessione al server");
            MyThread t=new MyThread("Connessione al server", tLoading);
            t.join();
            StringBuffer sb = new StringBuffer( "ftp://" );
            // check for authentication else assume its anonymous access.
            if (user != null && password != null){
                sb.append( user );
                sb.append( ':' );
                sb.append( password );
                sb.append( '@' );
            }
            sb.append( ftpServer );
            sb.append( '/' );
            sb.append( fileName );
            /*
            * type ==> a=ASCII mode, i=image (binary) mode, d= file directory
            * listing
            */
            sb.append( ";type=i" );

            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
            try{
//                new MyThread("Trasferimento file "+source.getName(), tLoading);
                System.out.println("Trasferimento file "+source.getName());
                URL url = new URL( sb.toString() );
                URLConnection urlc = url.openConnection();

                bos = new BufferedOutputStream( urlc.getOutputStream() );
                bis = new BufferedInputStream( new FileInputStream( source ) );

                int i;
                // read byte by byte until end of stream
                while ((i = bis.read()) != -1){
                    bos.write( i );
                }
            }
            finally{
//                new MyThread("Chiusura connessione al server", tLoading);
                System.out.println("Chiusura connessione al server");
                if (bis != null)
                    try{
                        bis.close();
                    }
                    catch (IOException ioe){
                        ioe.printStackTrace();
                    }
                if (bos != null)
                    try{
                        bos.close();
                    }
                    catch (IOException ioe){
                        ioe.printStackTrace();
                    }
            }
        }
        else{
            System.out.println( "Input not available." );
        }
   }
La scritta "prova" esce al momento giusto, mentre il valore nella text viene cambiato alla fine dell'esecuzione del metodo...