【问题标题】:wait for thread to finish (without "waiting") before next iteration在下一次迭代之前等待线程完成(没有“等待”)
【发布时间】:2013-05-26 03:23:05
【问题描述】:

我正在检查循环内的某些条件,如果满足该条件,那么我想启动一个新线程。

在我进行更新的线程中,该更新将对下一次迭代的条件产生影响。

我担心线程在下一次迭代之前不会完成(例如更新数据库或调用远程资源),并且在下一次迭代中,条件仍将评估相同,因此在更新之前将有两个或更多线程运行已启动。

我不能有任何计时器/等待或类似的东西。循环必须持续且瞬时地运行。

我正在考虑的一个解决方案是在线程内更新一个标志,并在线程完成之前检查相同的标志。

感谢您的任何反馈或建议。

【问题讨论】:

  • 不清楚..您想从下一次迭代中立即使用更改吗?
  • 不,我不希望这样做,因为在下一次迭代之前执行某些过程可能需要一些时间,所以不是针对相同的条件。但我不想拖延它,它必须继续下去。

标签: java multithreading


【解决方案1】:

不太确定你想做什么,但听起来你有一个巨大的事件循环。作为其中的一部分,当 State == X 时,您会产生一个子进程。然后孩子设置 State = Y,然后你继续用 Y 做一些事情。在产生一个孩子之后,你想等到 State = Y,同时仍然执行循环的其余部分。听起来对吗?

在这种情况下,只需在生成子项时设置一个标志,并且仅在未设置该标志时生成子项。

编辑 您需要在主线程中设置标志,而不是按照您的建议在子线程中设置。您无法保证子线程在主线程返回循环之前执行任何操作。

【讨论】:

  • 是的,您对大规模事件循环是正确的。是的,这就是我的意思,标志将在主线程中设置,子线程将更新其状态。因此条件检查将不断检查该标志。听起来对吗?
【解决方案2】:

不要使用线程 - 线程同步操作。

您需要同步行为:在主线程中执行更新。

【讨论】:

  • 当你的意思是“主线程”时,你指的是主循环吗?它只是一个循环,在该循环内我有一个条件(如果)检查,如果它评估为真,我会在其中启动一个新线程。但是因为线程内部有一些过程可能需要一些时间(例如更新数据库),所以我想确保我不会在下一次迭代中创建另一个相同的线程。
  • 我认为我不能为此使用同步行为,这无论如何都不会减慢初始主循环的速度。
  • 主线程是指执行循环的线程。更简单地说,就是不要使用线程
  • 发布一些代码。有几种方法可以让线程设置循环可以使用的值,但是查看一些代码会更容易,因此我可以为您量身定制解决方案。
  • 感谢 Bohemian,我相信我现在找到了一个很好的解决方案。感谢您的回复。
猜你喜欢
  • 2012-10-13
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
相关资源
最近更新 更多