【发布时间】:2019-02-09 10:47:17
【问题描述】:
我是多线程初学者,在 OCJP7 版本中遇到以下问题:
避免使用 Object.wait、Object.notify 和 Object 等方法 .notifyAll 在任务(Runnable 和 Callable 实例)中 提交给 Executor 或 ExecutorService。
有人可以解释为什么会这样吗?
【问题讨论】:
标签: java multithreading threadpool
我是多线程初学者,在 OCJP7 版本中遇到以下问题:
避免使用 Object.wait、Object.notify 和 Object 等方法 .notifyAll 在任务(Runnable 和 Callable 实例)中 提交给 Executor 或 ExecutorService。
有人可以解释为什么会这样吗?
【问题讨论】:
标签: java multithreading threadpool
使用Executor,您不知道如何在线程上安排任务。实际上,可能只有一个线程。
在病态的情况下,您最终会遇到Object.wait() 在任务中的单线程执行程序上的情况......并且没有任何东西运行到notify() 因为单线程执行器。结果你就死锁了。
即使有更多线程,如果相关任务恰好安排在同一个线程上,您仍然可能会陷入类似的死锁情况。
在任何情况下,Object.wait() 的阻塞行为意味着您正在暂停一个线程,而执行器的整个想法是将尽可能多的作业分配给数量有限的线程。这意味着即使您充其量通过阻塞整个线程和为它安排的所有其他等待任务来显着降低吞吐量。 IE。您不仅阻塞了执行wait() 的任务,还阻塞了在同一线程上安排在其后面的任何任务,因为该任务必须等待运行,直到您的阻塞任务完成。
【讨论】:
wait() 或 notify(),我我只是在解释为什么在被安排到 Executor 的任务中这样做可能不是最聪明的主意,因此警告 OP 提到了。