Pregunta

Aquí está la versión simplificada de mi requisito

Tengo una clase de Java que dice Procesador que contiene un método que dice bigProcess () todo lo que hace es conectarse a un servidor de archivos, descargar un archivo específico una vez que se haya hecho, guardar el archivo en la base de datos y luego actualizar algunos de los campos de la base de datos. en diferentes tablas.

Para cada una de las subtareas, como descargar el archivo, guardar en la base de datos, actualizar los campos en t1, etc., utiliza diferentes métodos.

La clase de procesador se invoca cada 2 horas y tiene que procesar alrededor de 30 a 40 solicitudes por cada invocación. Para mejorar el rendimiento, planeo abarcar un nuevo hilo para cada solicitud (30 a 40 hilos aquí) y cada hilo llama al método bigProcess.

Ahora mi pregunta es si necesito sincronizar alguno de los bloques de código en el método bigProcess () (aquí me preocupan los métodos de actualización de campos. Algunos de los métodos de actualización son bloquear una fila como selecte f1, f2, f3 de t1 para actualización, establece los valores para los campos f1, f2 & amp; f3 y emisión de confirmación)

NOTA: el método bigProcess () no usa ninguna variable de instancia de la clase Processor.

¿Fue útil?

Solución

Haga de BigProcess un Callable . Cuando lo envíe a un Ejecutor o ExecutorService vuelve a Future . Si lo haces future.get () en los 30-40 hilos, esos hilos se bloqueará hasta que se complete el Callable . O si el Callable se ha completado, devolverán el resultado inmediatamente.

Una forma alternativa de hacer esto (que me gusta) es crear un grupo de hilos, enviar todo el trabajo al grupo de hilos. Una vez que se haya enviado todo el trabajo, cierre y espere la terminación. Se ve algo como esto:

ExecutorService threadPool = Executors.newFixedThreadPool(40);
// submit work
threadPool.shutdown();
try {
  threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
  // do something
}

Si tiene trabajo dependiente (como la tarea B no se puede realizar hasta que la tarea A se complete), cree la tarea B con un Future de la tarea A y así sucesivamente.

Me gusta este enfoque porque todo es transitorio. Para una sola carga de la base de datos, todos los procesos se crearán, ejecutarán y desecharán. Cuando empiezas a crear un grupo de subprocesos persistentes, introduces otro problema potencial y es más difícil averiguar qué está pasando.

Otros consejos

Si necesita sincronizar sus métodos depende de lo que realmente hagan estos métodos. En general, debe sincronizarse si hay recursos que se utilizan desde varios subprocesos, como un solo archivo o una sola tabla en una base de datos (desde la cual está escribiendo y leyendo). Si todos los procesos que está ejecutando no se interfieren entre sí, no hay necesidad de sincronización.

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