Java Thread Pools/Executor Service and 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 个应该在某一点上处于活动状态)。还假设 正在一个对象上对第三方执行一些 I/O 调用,并在操作完成时等待回调,因此自然需要一段时间才能完成。wait()
现在我的问题是,当其中一个任务到达时,行为是什么,任务是否进入睡眠状态,然后线程池中的线程将另一个任务从队列中取出并开始运行它?wait()
如果正在等待的任务进入睡眠状态,那么当它到达并唤醒时会发生什么?线程是否返回到线程池的队列(在前面或后面)并等到5个线程中的一个可以继续执行它(即调用)?或者执行它的线程是否也进入睡眠状态,即5个执行器线程中的一个等待任务(这是我的假设)?或者执行器线程是否拾取另一个任务,并在第一个任务从 wait() 返回时被中断?notify()
doSomethingelse()