thread stop how example java multithreading jdbc timer

stop - timer thread java



Ejecutando un hilo de Java en intervalos (3)

Echa un vistazo a las clases Timer y TimerTask . Ellos son exactamente lo que quieres.

Puede hacer una implementación TimerTask que tome su objeto de hilo en un constructor.

El método de ejecución llamará al método de ejecución de hilos.

// Perhaps something like this Timer t = new Timer(); t.scheduleAtFixedRate(yourTimerTask, 0, 10 * 1000); // Hopefully your task takes less than 12 seconds

Tengo un hilo que debe ejecutarse cada 10 segundos. Este hilo contiene varias llamadas (12 - 15) a una base de datos en otro servidor. Además, también tiene acceso a alrededor de 3 archivos. En consecuencia, habrá bastante sobrecarga de IO y red.

¿Cuál es la mejor estrategia para realizar lo anterior?

Una forma sería usar el método de suspensión junto con un ciclo while, pero sería un mal diseño.

¿Será útil en este caso una clase similar a Timer? Además, ¿sería mejor crear un par de hilos más (uno para IO y otro para JDBC), en lugar de tenerlos ejecutados en un hilo?


Una opción es crear un ScheduledExecutorService al que luego pueda programar su trabajo:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor(); ex.scheduleWithFixedDelay(...);

Si decidiste tener varios hilos, entonces puedes crear un ScheduledExecutorService con más hilos (de nuevo, a través de la clase Executors).

En términos de cuántos hilos y qué pones en cada hilo, en términos de rendimiento, yo diría que esto depende de:

  • para su aplicación particular, ¿puede una cadena genuinamente "hacer trabajo" mientras que otra está esperando la E / S?
  • ¿Sus hilos múltiples finalmente "destrozarían el mismo recurso" (por ejemplo, leerían archivos en diferentes lugares en el mismo dsk) y, por lo tanto, se ralentizarían unos a otros, o estarían golpeando simultáneamente diferentes recursos?

Encuentro que un ScheduledExecutorService es una excelente manera de hacer esto. Podría decirse que es un poco más complejo que un Timer , pero ofrece más flexibilidad a cambio (por ejemplo, puede optar por usar un solo hilo o un grupo de subprocesos, toma unidades que no sean únicamente milisegundos).

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); Runnable periodicTask = new Runnable() { public void run() { // Invoke method(s) to do the work doPeriodicWork(); } }; executor.scheduleAtFixedRate(periodicTask, 0, 10, TimeUnit.SECONDS);