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