Пулы потоков Java / служба исполнителя и wait () s - что происходит с потоками и очередью задач?

Я осмотрелся, но не нашел ответа, поэтому хотел подтвердить это наверняка.

Допустим, у меня есть пул потоков фиксированного размера - 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 ()?

17
задан NightWolf 1 March 2012 в 10:30
поделиться