【问题标题】:how to use multiple threads, in sync?如何同步使用多个线程?
【发布时间】: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


【解决方案1】:

好的,首先我要感谢大家的帮助,你们给我的一些链接对我很有帮助。

我发现了我的问题:我试图在同一个对象上同时使用来自 2 种不同类型线程的等待/通知方法。我有使用等待和'notifyAll'的'CellThread',我有同样的'RunMatrixThread'。他们当然有“同步”的方法,但因为他们是两种不同类型的线程,这两种类型并不同步。 解决问题的是我在“RunMatrixThread”类中创建了 2 个新的同步方法,一个用于等待,一个用于通知,然后只要我想等待/通知,就从所有线程(来自两个线程类)调用这些方法。这样一来,就有了一个统一的对象,它锁定了一切。

PS:我知道使用这么多线程是个坏主意。这是粗人的任务,他们要求我们这样做。

【讨论】:

    【解决方案2】:

    如果您试图让“工作线程”完成由“主”线程授权/启动/分配的工作,那么您可能应该使用 线程池(例如,https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html

    线程池负责创建工作线程并将它们的活动与主线程“同步”,它让您可以专注于工作线程执行的任务。


    数组中的每个单元格都有一个线程...

    对于 Conway's Life,方式工作线程太多。如果工作是纯粹受计算限制的,那么拥有比主机拥有的处理器执行线程多得多的线程是没有意义的。

    如果我为具有 N 个处理器的主机编写寿命,我会使用具有 N 个线程的线程池。而且,在每一代中,我都会让主线程向池中提交 N 个任务:每个任务将执行一个水平条纹。

    【讨论】:

      【解决方案3】:

      不要使用并行化。在使用线程之前,请考虑您是否真的可以并行化您的工作,因为如果您的所有任务都必须彼此同步,那么使用线程不会在执行时间方面为您提供更好的性能。假设您有一个对象数组 [a,b] 如果 a 必须等待 b 上的某些更改,则您不能将 a 和 b 分开处理,因此您无法并行化您的工作。相反,如果您需要处理 a、b 和数组的所有元素并最后对它们执行一些计算,您可以使用 join() 方法加入线程。当您调用 join 方法时,您基本上将线程分支合并为一个(主线程)。一个新线程将分叉您的主线程,而 join 将加入这些线程。

      【讨论】:

      • 我理解,我 100% 支持你,但这是大学的任务,要求我们使用线程,所以我别无选择。我们被要求以这种方式使用线程来执行此操作。在这一点上,我很清楚它没有生产力。
      • OP 正在实施 Conway's Life。这是一个高度可并行化的任务。
      • 我在回答这个问题时没有看到“编辑”,以后可能会添加
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      相关资源
      最近更新 更多