Не рекомендуется использовать методы wait (), notify () в ExecutorService - PullRequest
0 голосов
/ 09 февраля 2019

Я новичок в многопоточности и в выпуске OCJP7 встречал следующее:

Избегайте использования таких методов, как Object.wait, Object.notify и Object .notifyAll в задачах (Runnable и Callable).экземпляры), которые передаются Executor или ExecutorService.

Может кто-нибудь объяснить, почему это так?

1 Ответ

0 голосов
/ 09 февраля 2019

С Executor вы не знаете, как задачи планируются в потоках.В самом деле, это может быть только один поток.

В патологическом случае вы попадаете в ситуацию, когда вы Object.wait() выполняете однопоточный исполнитель в задаче ... и ничто не запускается к notify() , потому что этоявляется однопоточным исполнителем.В результате вы получаете тупик.

Даже при большем количестве потоков вы все равно можете оказаться в аналогичной ситуации взаимоблокировки, если соответствующие задачи запланированы в том же потоке.

В любом случае,Поведение блокировки Object.wait() означает, что вы останавливаете поток, тогда как основная идея исполнителя заключается в том, чтобы выполнить как можно больше заданий для гораздо более ограниченного числа потоков.Это означает, что даже в лучшем случае вы значительно снижаете пропускную способность, блокируя весь поток и всех других ожидающих задач, запланированных для него.Т.е. вы не просто блокируете задачу, которая выполняет wait(), вы также блокируете любую задачу, запланированную за ней в том же потоке, поскольку эта задача должна ждать, пока не завершатся ваши задачи блокирования.

...