Java等待线程完成

新手上路,请多包涵

我有一个线程正在下载数据,我想等到下载完成后再加载数据。有这样做的标准方法吗?

更多信息:

我有一个从 URL(序列化 POJO)获取数据的下载类。下载是可运行和可观察的。它跟踪下载的字节数和下载大小。我有一个进度条,向用户显示进度。 GUI 观察下载以更新进度条。

下载 POJO 后,我想获取它并转到下一步。每一步都必须等待前一步完成。问题是我想不出一种方法来暂停我的应用程序以等待下载线程。下载完成后,我想调用 download.getObject() 它将数据作为对象返回。然后我可以投射它并继续下一次下载。

我有一个帮助程序类来管理下载 URL 并进行所有下载调用。此调用将调用 getObject 并进行转换。 Gui 调用 helper.getUser() 。 helper 启动线程运行,我希望它在完成时“知道”,以便它可以返回转换后的对象。

有什么建议/例子吗?我正处于这个设计的开始阶段,所以我愿意改变它。

更新:

我按照 http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html#get 并使用模态阻塞直到线程完成。代码很乱,我不喜欢这种方法。我将继续努力寻找一种“干净”的方式来处理下载过程的工作流程。

原文由 Allan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 353
2 个回答

Thread 有一个方法可以为你 加入,它将阻塞直到线程完成执行。

原文由 unholysampler 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 CountDownLatch java.util.concurrent 。当在等待线程中继续执行之前等待一个或多个线程完成时,它非常有用。

比如等待三个任务完成:

 CountDownLatch latch = new CountDownLatch(3);
...
latch.await(); // Wait for countdown

其他线程然后每次调用 latch.countDown() 完成他们的任务。一旦倒计时完成,在此示例中为三,执行将继续。

原文由 permagnusson 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题