不建议在 ExecutorService 中使用 wait(),notify() 方法
Not Advisable to use wait(),notify() methods in ExecutorService
我是多线程的初学者,在 OCJP7 版本中遇到了以下问题:
Avoid using methods such as Object.wait, Object.notify, and Object
.notifyAll in tasks (Runnable and Callable instances) that are
submitted to an Executor or ExecutorService.
谁能解释一下为什么会这样?
有了 Executor
你不知道任务是如何在线程上安排的。实际上,可能只有一个线程。
在病态情况下,您最终会遇到这样一种情况,即您 Object.wait()
在任务中的单线程执行器上......并且什么都没有 运行 notify()
因为它是单线程执行器。结果你陷入了僵局。
即使有更多线程,如果相关任务恰好安排在同一个线程上,您仍然可能会陷入类似的死锁情况。
在任何情况下,Object.wait()
的阻塞行为意味着您正在停止一个线程,而执行程序的整个想法是将尽可能多的作业分包给数量更有限的线程。这意味着即使在最好的情况下,您也会通过阻塞整个线程 和 为它安排的所有其他等待任务来显着降低吞吐量。 IE。您不仅阻塞了执行 wait()
的任务,您还阻塞了在同一线程上安排在它后面的任何任务,因为该任务必须等待 运行 直到阻塞任务完成。
我是多线程的初学者,在 OCJP7 版本中遇到了以下问题:
Avoid using methods such as Object.wait, Object.notify, and Object .notifyAll in tasks (Runnable and Callable instances) that are submitted to an Executor or ExecutorService.
谁能解释一下为什么会这样?
有了 Executor
你不知道任务是如何在线程上安排的。实际上,可能只有一个线程。
在病态情况下,您最终会遇到这样一种情况,即您 Object.wait()
在任务中的单线程执行器上......并且什么都没有 运行 notify()
因为它是单线程执行器。结果你陷入了僵局。
即使有更多线程,如果相关任务恰好安排在同一个线程上,您仍然可能会陷入类似的死锁情况。
在任何情况下,Object.wait()
的阻塞行为意味着您正在停止一个线程,而执行程序的整个想法是将尽可能多的作业分包给数量更有限的线程。这意味着即使在最好的情况下,您也会通过阻塞整个线程 和 为它安排的所有其他等待任务来显着降低吞吐量。 IE。您不仅阻塞了执行 wait()
的任务,您还阻塞了在同一线程上安排在它后面的任何任务,因为该任务必须等待 运行 直到阻塞任务完成。