【问题标题】:Not Advisable to use wait(),notify() methods in ExecutorService不建议在 ExecutorService 中使用 wait(),notify() 方法
【发布时间】:2019-02-09 10:47:17
【问题描述】:

我是多线程初学者,在 OCJP7 版本中遇到以下问题:

避免使用 Object.wait、Object.notify 和 Object 等方法 .notifyAll 在任务(Runnable 和 Callable 实例)中 提交给 Executor 或 ExecutorService。

有人可以解释为什么会这样吗?

【问题讨论】:

    标签: java multithreading threadpool


    【解决方案1】:

    使用Executor,您不知道如何在线程上安排任务。实际上,可能只有一个线程。

    在病态的情况下,您最终会遇到Object.wait() 在任务中的单线程执行程序上的情况......并且没有任何东西运行到notify() 因为单线程执行器。结果你就死锁了。

    即使有更多线程,如果相关任务恰好安排在同一个线程上,您仍然可能会陷入类似的死锁情况。

    在任何情况下,Object.wait() 的阻塞行为意味着您正在暂停一个线程,而执行器的整个想法是将尽可能多的作业分配给数量有限的线程。这意味着即使您充其量通过阻塞整个线程为它安排的所有其他等待任务来显着降低吞吐量。 IE。您不仅阻塞了执行wait() 的任务,还阻塞了在同一线程上安排在其后面的任何任务,因为该任务必须等待运行,直到您的阻塞任务完成。

    【讨论】:

    • "notify() 没有运行任何东西" - 没有必要,线程池之外可以有线程,例如启动一堆任务并等待它们完成的主线程。在任务中使用 Object.notify 和 Object.notifyAll 没有错。
    • @AlexeiKaigorodov 不是病态的情况,这正是为什么它是病态的......我并不是说你永远不能使用 wait()notify(),我我只是在解释为什么在被安排到 Executor 的任务中这样做可能不是最聪明的主意,因此警告 OP 提到了。
    • 您将病理情况描述为使用 Object.wait() 的地方。我说的只是 Object.notify 和 Object.notifyAll,而不是 Object.wait()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多