Estoy revisando el código Java que, en esencia, es un proceso recurrente que mueve/lee/analiza algunos archivos de forma regular y genera datos en la base de datos. La parte que se repite se hace (más o menos) de la siguiente manera:Java - Thread.sleep en el método principal
public class CollectorMain {
public static boolean signalRecieved = false;
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
shutdown();
}});
while(!signalRecieved) {
Collector.execute();
try {
Thread.sleep(60 * 1000);
} catch (InterruptedException e) {
break;
}
}
// some shutdown logic
}
public static void shutdown() {
signalReceived = true;
}
}
public class Collector() {
public static void execute() {
// Move files from the queue dir to temp location
// Read, parse files and insert records into database.
// Then delete the processed files
}
}
Mi recomendación fue refactorizar código para
- Crear instancia de colector y refactorizar método estático ejecutar() para el método de instancia
- Para use Runnable o TimerTask para manejar las invocaciones
Mi argumento fue que usar Thread.wait desde el método principal y combinarlo con acceso estático no es una buena forma de o f manejando un proceso repetible, especialmente haciendo el archivo IO. Para que el autor respondió (donde se cita)
La descripción de Ejecutable dice "debe aplicarse a cualquier clase cuyas instancias están destinados a ser ejecutado por un hilo". De hecho, I estoy evitando intencionalmente los hilos en este programa, por razones de costo requisitos de rendimiento.
Aquí hay otra cita del mismo debate que se espera ayude a aclarar la posición del autor
Técnicamente, Java no se ejecuta en absoluto, que es interpretado por la JVM que luego ejecuta las instrucciones de la máquina, para simular que el código Java se está ejecutando. Entonces, realmente es la JVM la que se ejecuta en un subproceso o varios subprocesos.
Pero como escritor de código Java, no me importa. Si no creo "hilos" en Java, el trabajo de la JVM es que parezca que no hay hilos , incluso si la JVM está utilizando hilos "debajo de las cubiertas".
Una pausa de Java no se ejecuta, se simula mediante una secuencia de instrucciones de la máquina que pueden o no llamar a un OS 'espera'. (Probablemente lo haga, porque la JVM no querría girar, grabar ciclos de CPU, pero eso es una opción de implementación de JVM).
así que tengo 2 preguntas:
- está poniendo
Thread.wait
en el método principal forma de fiar, segura y conveniente de hacer la tarea repetible en este caso? Y si no, ¿por qué no, ya que solo hay un hilo (principal) de ejecución? - ¿Cuáles son las dificultades del uso de métodos estáticos en este contexto (si corresponde)?
Estaremos encantados de proporcionar información adicional si tiene alguna otra pregunta.
¿No debería estar protegido 'signalRecibved' (por ejemplo' volátil') ya que se comparte entre el hilo principal y el gancho de cierre? – dacwe
Buen punto, va a la idea de "no usar múltiples hilos" – Bostone
Los ganchos de cierre __son hilos separados. – toto2