gpt4 book ai didi

java - 如何让线程等待特定条件

转载 作者:行者123 更新时间:2023-11-29 04:08:35 24 4
gpt4 key购买 nike

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

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

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

  • 号码已添加
  • 有一个数大于 n,所以我知道 n 不可能是质数。

而且它只允许在这种情况下通知线程。所以我无法在每个数字添加到集合中后通知并检查它是否是数字或更高。

你能给我解释一下这种等待条件而不用忙等待吗?

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

最佳答案

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

一个简单的解决方案是这样的:

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

该解决方案的巨大优势:素数生成器不需要知道有多少素数测试器存在。它只是通知所有在公共(public)监视器上等待的线程。

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

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

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

关于java - 如何让线程等待特定条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56630680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com