【发布时间】:2018-11-23 08:19:23
【问题描述】:
我有多个线程,它们都从一个对象运行。 我希望“主线程”单独运行直到某个点,然后它等待所有其他线程一起运行,然后主线程唤醒,等等...... 我无法同步我的线程。我要么得到一个非法监视器状态异常,要么它卡在一个“等待”循环中,该循环假设接收到一个永远不会到达的“通知”。
更具体地说,我有一个带有数组的对象。数组中的每个单元格都有一个线程检查相邻单元格,然后使用该信息更改它的单元格。 为了使更改有序,我希望所有单元格首先检查其相邻单元格并保留它们产生的值,然后等待。 当所有这些都完成后,主线程将唤醒所有它们并更新它们各自的单元格。
我查看了“等待”和“通知”的工作原理,但我仍然不明白它们是如何同步的。据我了解,我需要将它们全部连接到一个对象,然后该对象是“锁”,所以如果我在其方法上使用“同步”,一次只有一个线程可以接近它?我怎样才能确保“等待”方法总是有一个“通知”来结束它?
编辑: 该方法基本上运行了康威的人生游戏。 代码的主要方向是这样的: LifeMatrix 类扩展了 JPanel。它有一组面板,每个面板都是“死的或活的”(真/假)。 RunMatrixThread 类扩展了线程,并且是协调代码的“主线程”。 CellThead 类扩展了线程,并且为矩阵中的每个单元创建了一个 CellThread。 所以我的想法是给所有线程“LifeMatrix”作为观察者,但是如果我尝试通知 LifeMatrix 对象(使用 matrix.notify())它会给我非法监视器状态异常,如果我尝试使用“通知所有”它卡在 RunMatrixThread 的 wait() 命令中。 另外,我通知一个对象吗?还是通知正在等待的线程?
【问题讨论】:
-
邮政编码不是文字
-
它的代码很长。我可以上传整个东西吗?
-
然后构建一个自包含的示例。查看 java.concurrent 包可能是值得的。 Thera 是诸如 Futre 和其他高级 API 之类的东西,例如等待和同步
-
不贴真实代码,只贴简化版。以便我们为您提供帮助。
标签: java multithreading object wait notify