首页 > 解决方案 > 如何让线程等待特定条件

问题描述

有一个线程计算素数并将它们添加到集合中。

现在有其他线程将执行一个bool isPrime(long n)方法。如果它包含数字 (n),此方法将只查看集合。

但是执行的线程isPrime(...)需要等到:

在这种情况下,它只允许通知线程。因此,我无法在添加到集合中的每个数字后通知并检查其是否为数字或更高。

您能否在不忙于等待的情况下给我一些关于这种等待条件的解释?

我只知道我可以让线程等待对象,而其他线程可以通知它们,但我无法理解这种行为,也许我只是想错了。

标签: javamultithreadingthread-safety

解决方案


这实际上取决于您的整体设计。

一个简单的解决方案将像这样工作:

  • 你有 1 个线程 prime-generator 和 n 个线程 prime-testers
  • 最初所有主要测试人员都打电话wait()
  • 每次 prime-generator 添加一个新的 prime,它都会通知所有prime-testers
  • 每个测试人员检查它的号码(或更大的号码)是否已经在,如果测试人员找到它的号码,或者知道“不在”。如果没有,它会wait()再次调用。

该解决方案的最大优点是:prime-generator 不需要知道存在多少 prime-testers。它只是通知所有在一个公共监视器上等待的线程。

或者,素数生成器可以确切地知道存在哪些素数测试者,以及他们负责的数量。因此,它不会唤醒所有测试人员,而是只通知需要知道的测试人员。

请理解:您只是给出了一些模糊的要求,没有任何代码。因此,您会收到一个模糊的答案,没有任何代码。我的回答旨在作为指导你下一步作业的灵感。

只是为了记录:如果你想得到非常大的素数,那么使用列表是一个糟糕的选择。假设您的列表包含 100 万个素数。调用的成本contains()将随着条目的数量线性增长。因此,宁愿使用允许快速查找元素(某种集合/树)的集合,也可以快速访问集合中当前的“最后一个”(最大)数字。


推荐阅读