Я огляделся, но не нашел ответа, поэтому я хотел подтвердить это наверняка.
Скажем, у меня есть пул потоков фиксированного размера - ExecutorService pool = Executors.newFixedThreadPool(5);
И у меня есть код:
pool.execute(new Runnable(){
try{
Object waitForMe = doSomethingAndGetObjectToWaitFor();
waitForMe.wait();
doSomethingElse();
}catch(Exception e){ throw new RunTimeException(e) }
});
Предположим, что вышеупомянутый код называется несколько раз. В пуле всего 5 потоков (так что только 5 из приведенных выше заявлений должны быть в режиме реального времени в одной точке). Также предположим, что wait()
находится на объекте, выполняющем некоторые вызовы ввода-вывода на стороне thrid и ожидая обратного вызова, когда операция завершена, поэтому, естественно, потребуется некоторое время для завершения.
Теперь мой вопрос в том, что такое поведение, когда одна из этих задач достигает wait()
, выполняет ли задача спать, а затем поток из пула потоков отводит очередную задачу и запускает ее?
Если ожидаемая задача ложится спать, что происходит, когда она получает notify()
и просыпается? Возвращает ли поток в очередь (спереди или сзади) для пула потоков и ждет, пока один из 5 потоков не сможет продолжить его выполнение (т.е. Вызов doSomethingelse()
)? Или поток, который его выполнял, также переходит в спящий режим, т.е. Один из 5 потоков исполнителей сидит в ожидании с задачей (это то, что я предполагаю)? Или поток исполнителей поднимает другую задачу и просто прерывается, когда первая задача возвращается из wait()?