等待线程在Java中完成

时间:2013-03-30 22:08:08

标签: java swing jframe swingworker

我有一些代码在一个单独的线程中执行下载,创建这个代码以便JFrame GUI在下载过程中继续更新。但是,当我使用Thread.join()时,目的完全失败,因为它导致GUI停止更新。我需要一种方法来等待线程完成并仍然更新GUI。

1 个答案:

答案 0 :(得分:4)

您可以让执行下载的任务也向GUI发起事件。

例如:

Runnable task = new Runnable() {
   public void run() {
      // do your download

      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            // call some method to tell the GUI that the download finished.
         }
      });
   }
};

然后运行它,使用Executor(首选方法)或原始线程:

executor.execute(task);

new Thread(task).start();

正如评论中指出的那样,您通常会使用SwingWorker来执行此类操作,但您也可以执行上述手动方法。

SwingWorker提供了一种doInBackground方法,您可以将下载逻辑放在一个done方法中,您可以在其中使用代码来通知GUI下载完成并使用get方法得到doInBackground的结果(如果有的话)。

如,

class Downloader extends SwingWorker<Object, Object> {
   @Override
   public Object doInBackground() {
       return doDownload();
   }

   @Override
   protected void done() {
       try { 
         frame.downloadDone(get());
       } catch (Exception ignore) {
       }
   }
}

(new Downloader()).execute();