He buscado pero no he encontrado una respuesta, así que quería confirmar esto con certeza.Java Thread Pools/Executor Service y wait() s: ¿qué ocurre con los hilos y la cola de tareas?
decir que tengo un grupo de subprocesos tamaño fijo - ExecutorService pool = Executors.newFixedThreadPool(5);
y tengo algo de código:
pool.execute(new Runnable(){
try{
Object waitForMe = doSomethingAndGetObjectToWaitFor();
waitForMe.wait();
doSomethingElse();
}catch(Exception e){ throw new RunTimeException(e) }
});
supongamos que el código anterior se llama un par de 100 veces. Solo hay 5 subprocesos en el grupo (por lo que solo 5 de los enunciados anteriores deben estar en vivo en un punto). Supongamos también que wait()
está en un objeto que realiza algunas llamadas de E/S a un tercero y espera una devolución de llamada cuando se completa la operación, por lo que demorará un tiempo en completarse.
Ahora mi pregunta es ¿cuál es el comportamiento cuando una de estas tareas llega a wait()
, la tarea pasa a la suspensión y luego el hilo del grupo de subprocesos retira otra tarea de la cola y comienza a ejecutarla?
Si la tarea que está esperando va a dormir, ¿qué sucede cuando se obtiene un notify()
y se despierta? ¿El hilo vuelve a la cola (en la parte delantera o posterior) para el grupo de subprocesos y espera hasta que uno de los 5 subprocesos pueda seguir ejecutándolo (es decir, llame al doSomethingelse()
)? ¿O el hilo que lo estaba ejecutando también se va a dormir, es decir, uno de los 5 subprocesos del ejecutor está esperando la tarea (esto es lo que asumo)? ¿O el ejecutor retoma una nueva tarea y simplemente se interrumpe cuando la primera tarea regresa de wait()?
¡Gracias por la gran respuesta! Con la opción de devolución de llamada, ¿cuál sería la mejor manera de establecer un tiempo de espera (por ejemplo, desea esperar x segundos para una devolución de llamada si nada arroja un error). La única forma en que puedo pensar es tomar nota del milisegundo actual del sistema y mantenerlo en una lista y hacer que otro subproceso controle la lista para las llamadas que han excedido la hora actual y desencadenan un error. Necesito encontrar un buen libro que trate sobre simultaneidad, devolución de llamadas, etc. ¡Gracias de nuevo! – NightWolf
@NightWolf: wrt a los tiempos de espera ver mi respuesta actualizada. Cuando se trata de un buen libro, [Concurrencia de Java en la práctica] (http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601) es una necesidad. –
Gracias a montones por la actualización y el enlace del libro, buena idea. Tristemente no tengo ningún control sobre el lado de los terceros. – NightWolf