【问题标题】:Wait for a thread to finish before continuing the current thread?在继续当前线程之前等待线程完成?
【发布时间】:2015-05-14 00:39:55
【问题描述】:

所以我有一个方法:

Runnable task = new PostLoadRunnable(tool, archive);
SwingUtilities.invokeLater(task);

但我想让当前方法在任务线程完成之前不会继续。我想做类似join() 的事情,但我不知道该怎么做。 task.join()Thread.task.join() 不起作用,Thread.currentThread().join() 没有给我任何选项来将其加入我想要的线程。

如何在任务完成之前停止该方法?

【问题讨论】:

  • 如果要在完成后继续,为什么要使用线程?线程的思想是并行执行代码。对不起,平庸的英语。
  • Thread.currentThread.join 不起作用,因为它指的是您调用 InvokeLater 的线程,而不是实际的背景/事件线程。 SwingUtilities.invokeAndWait 做你想做的事吗?
  • 你不想在这里等待线程完成 - 你想等待一些代码完成。
  • 因为我还有其他线程必须先完成,然后我需要任务运行并完成,然后继续。
  • @wrschneider99 它说我无法从事件调度程序线程调用 invokeAndWait。我不太擅长线程,也不太了解。加入听起来像我想要的,但我不知道如何将它“附加”到任务和当前线程

标签: java multithreading


【解决方案1】:

您可以使用CountDownLatch 完成此操作。在您的 PostLoadRunnable 运行方法中,您可以在 finally 部分中包含以下代码。

public void run() {
    try {
        ...
    } finally {
        latch.countDown();
    }
}

CountDownLatch latch = CountDownLatch(1);
Runnable task = new PostLoadRunnable(tool, archive, latch);
SwingUtilities.invokeLater(task);
latch.await();

【讨论】:

  • 这听起来很完美,但会永远冻结应用程序,我原以为它只会冻结几秒钟。
  • @Aequitas 如果只需要几秒钟,为什么要冻结?
【解决方案2】:

您根本不想这样做。您在 cmets 中声明此代码在事件调度程序线程中运行。您不得阻止此线程。否则你会冻结整个 UI,用户会很不高兴。

可能应该做的是禁用 UI 的相关部分,直到任务完成。但如果不知道您实际更广泛的要求,则无法确定。

【讨论】:

  • 冻结是可以的,因为它正在加载文件所以什么都不应该做,大多数应用程序会在加载文件时冻结。
  • 这不仅仅是冻结。这是您的应用程序的完全锁定。当您调用invokeLater 时,您是在告诉 Swing 在事件调度程序线程上调用该任务。但是,如果您随后阻塞事件调度程序线程以等待任务完成,那么您将无法执行任务,因为您阻塞了它需要运行的线程。正如您在@shazin 的回答中所发现的那样。
  • @Aequitas 用户会将任何冻结的应用程序视为损坏。我当然愿意。他们会认为它已经崩溃,尝试关闭它等等。禁用 UI 没关系,只是。为什么你认为你需要对此做任何事情
  • @ErwinBolwidt 我不明白它不应该在不同的线程上执行吗?这不是重点吗?所以事件调度线程应该等待invokeLater启动的线程完成
  • @Aequitas 恰恰相反。如果你启动了一个不同的线程,但你需要对用户界面做一些事情,你可以使用invokeLaterinvokeAndWait 来安排Swing调度线程上的一些工作。虽然invokeLater 也可以从调度线程调用,但没有多大意义,因为您已经被允许从调度线程触摸 UI。
猜你喜欢
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多