Pregunta

No soy nuevo en Ejecutorservice, pero no estoy seguro de mi enfoque de esto. Podría estar lidiando con hasta 100 hilos para una tarea conocida. Estoy usando el formato general a continuación, donde creo una lista de Futuretasks, luego envíolas al EjecutorService. EjecutorService devuelve y agrega estos resultados pendientes a otra lista. Luego ito sobre esta lista, llamando a get () en cada resultado pendiente.

Mi consulta es: ¿este bloque en cada uno get () a su vez hasta que los 100 hilos se hayan completado? Hay una mejor manera de hacer esto ?

¿Y tengo razón al asumir que Get () devuelve el resultado del método de llamada () de la implementación llamable? Estoy usando la clase de FutureTask predeterminada y no la he subclasiado.

ExecutorService exec = Executors.newFixedThreadPool( NUM_THREADS );

List<JobClass> originalList = new ArrayList<JobClass>();

List<SomeOtherClass> pendingResult = new ArrayList<SomeOtherClass>();

List<Future<SomeOtherClass>> resultList = new ArrayList<Future<SomeOtherClass>>();

for( JobClass sc : originalList )
    pendingResult.add( submit( sc );

for( Future<SomeOtherClass> future : futures )
    resultList.add( future.get(5, TimeUnit.SECONDS) ); 
¿Fue útil?

Solución

Buena pregunta, si lo entiendo correctamente, le preocupa el consumo del resultado de tareas completadas. Sí, el hilo bloqueará. La respuesta de Java a eso es usar el Servicio de finalización.

Como se menciona en la página de documentación "un servicio que desacopla la producción de nuevas tareas asincrónicas del consumo de los resultados de las tareas completadas".

Otros consejos

Si solo continúa si todas las tareas se completan, puede hacer lo que sugirió. No importará en qué orden se completen las tareas. Sin embargo, si necesita pasar los resultados de la tarea a otro procesador lo antes posible o hacer algo más mientras se ejecutan las tareas, es posible que desee verificar si la tarea se completa primero usando isDone método, por ejemplo, y llamar get() Si está completo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top