java - 如何让线程等待特定条件
问题描述
有一个线程计算素数并将它们添加到集合中。
现在有其他线程将执行一个bool isPrime(long n)
方法。如果它包含数字 (n),此方法将只查看集合。
但是执行的线程isPrime(...)
需要等到:
- 号码已添加
- 有一个大于 n 的数字,所以我知道 n 不能是素数。
在这种情况下,它只允许通知线程。因此,我无法在添加到集合中的每个数字后通知并检查其是否为数字或更高。
您能否在不忙于等待的情况下给我一些关于这种等待条件的解释?
我只知道我可以让线程等待对象,而其他线程可以通知它们,但我无法理解这种行为,也许我只是想错了。
解决方案
这实际上取决于您的整体设计。
一个简单的解决方案将像这样工作:
- 你有 1 个线程 prime-generator 和 n 个线程 prime-testers
- 最初所有主要测试人员都打电话
wait()
- 每次 prime-generator 添加一个新的 prime,它都会通知所有prime-testers
- 每个测试人员检查它的号码(或更大的号码)是否已经在,如果测试人员找到它的号码,或者知道“不在”。如果没有,它会
wait()
再次调用。
该解决方案的最大优点是:prime-generator 不需要知道存在多少 prime-testers。它只是通知所有在一个公共监视器上等待的线程。
或者,素数生成器可以确切地知道存在哪些素数测试者,以及他们负责的数量。因此,它不会唤醒所有测试人员,而是只通知需要知道的测试人员。
请理解:您只是给出了一些模糊的要求,没有任何代码。因此,您会收到一个模糊的答案,没有任何代码。我的回答旨在作为指导你下一步作业的灵感。
只是为了记录:如果你想得到非常大的素数,那么使用列表是一个糟糕的选择。假设您的列表包含 100 万个素数。调用的成本contains()
将随着条目的数量线性增长。因此,宁愿使用允许快速查找元素(某种集合/树)的集合,也可以快速访问集合中当前的“最后一个”(最大)数字。
推荐阅读
- azure - Azure 服务总线 - 多个订阅者不会收到所有消息
- excel-formula - Excel公式使单元格只读
- java - 保存更多 10 个项目的 ArrayList 未排序到 DB
- callback - 我在哪里可以找到无限网格存储的其他回调?
- oracle12c - 如何从 SOA Web 服务调用中解锁 IBM 内容导航器中的对象
- c# - 为什么 JWT 过期太快
- excel - 如何从 Excel VBA 代码触发 Access 数据库表单中的单击
- asp.net-mvc - 如果 IIS 应用程序工作进程挂起会怎样?
- python - 多线程时循环不使用新变量运行
- java - 我们使用@inject 时的默认范围是什么