code: public void run() {
          try {
              copy();
          } catch(Exception e) {
              if (listeners != null) {
                  Iterator iter = listeners.iterator();
                  while(iter.hasNext()) {
                      ((UrlCopyListener)iter.next()).transferError(e);
                  }
              }
          } finally {
              if (listeners != null) {
                  Iterator iter = listeners.iterator();
                  while(iter.hasNext()) {
                      ((UrlCopyListener)iter.next()).transferCompleted();
                  }
              }
          }
      }
docs: This method is an implementation of the {@link Runnable} interface
  and can be used to perform the copy in a separate thread.
  <p>
  This method will perform the transfer and signal completion and
  errors through the {@link UrlCopyListener#transferCompleted()} and
  {@link UrlCopyListener#transferError(Exception)} of any registered listeners
  (see {@link #addUrlCopyListener(UrlCopyListener)}).