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