Java 等待线程完成

2022-08-31 11:47:49

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

更多信息:

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

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

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

任何建议/示例?我正处于这个设计的开始阶段,所以我愿意改变它。

更新:

我遵循 http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html#get 并使用模态来阻止,直到线程完成。代码非常混乱,我不喜欢这种方法。我会继续尝试找到一种“干净”的方式来处理下载过程的工作流程。


答案 1

Thread有一个方法可以为您连接执行此操作,该方法将阻塞,直到线程完成执行。


答案 2

您可以使用包中的 。在等待一个或多个线程完成,然后在等待线程中继续执行时,它非常有用。CountDownLatchjava.util.concurrent

例如,等待三个任务完成:

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

然后,其他线程在完成其任务时进行调用。倒计时完成后(在本例中为三个),执行将继续。latch.countDown()