Dudas con Hilos
Hola buenas tardes, de antemano un saludo a la comunidad.
Como he leido en otros foros, es nefasto que algunos pidan casi que le ayuden a hacer la tarea. en mi caso es distinto, quiciera solo me dieran una orientacion, de la investigacion posterior yo continuare.
Tengo un proyecto, que este buscará dentro de una tabla de mysql los valores numericos, y dependiendo del valor encontrado ejecutará un procedimiento de un jar exterior.
ha lo que he leido de los hilos, son procesos lijeros que se ejecutan como parte independiente del programa padre. y es precisamente lo que busco ( que el programa padre continue buscando valores numericos en la tabla de mysql y los hilos ejecutandose independiente ). Pero me surjen bastantes dudas.
1. Dependiendo de los valores numerico encontrados en la tabla de mysql, seran los procedimientos a llamar del jar exterior. Tendre que hacer varios hilos entonces.?
2. si es el caso de crear varios hilos, como sabre cuales ya estan colgados y poder forzarlos a terminar.
********
Timer INICIO
Buscar Hilos con tiempo en ejecucion mayor a X min > 0 , Forzar a terminarlos
1. Buscar bloque de registros en tabla mysql, con valores X INICIO
Registros >0 llamar Hilo a ejecutar procedimiento de jar externo X
1. Buscar bloque de registros, con valores X FIN
2. Buscar bloque de registros en tabla mysql, con valores Y INICIO
Registros >0 llamar Hilo a ejecutar procedimiento de jar externo Y
2. Buscar bloque de registros, con valores Y FIN
....
....
n...
Timer FIN
- Inicie sesión o regístrese para enviar comentarios
¿Existe forma en que no
¿Existe forma en que no cuelgues hilos? Me refiero a ¿porque habría de colgarse en primer lugar? ¿ Es una condición normal y esperada?
Pregunta sobre el proceso que esta en el jar ¿Vas a llamarlo como un programa externo a propósito? Los jars, si son incluídos en el proyecto pueden ser ejecutados dentro de la misma máquina virtual, no sé si sepas esto y quieres de todas formas crear una nueva VM para cada proceso.
Ahora, aquí va alguna guía:
Si lo que quieres es llamar a un proceso externo ( un jar por ejemplo ) puedes utilizar la clase
y dejar que el sistema operativo cree la nueva máquina virtual y todo.
Si quieres llamar a una clase dentro de tu programa, entonces sí , puedes usar los hilos.
Si usas hilos, la forma más fácil de detenerlos es preguntar controlarlo en un loop si una condición se cumpló o no:
Espero que esto te sirva de guía y cuando tengas algo más concreto no dudes en preguntar de nuevo.
Saludos.
Gracias por tu apoyo
Oscar, muchas gracias por tu apoyo, en este caso se va a llamar un procedimiento de un jar externo. me voy a enfocar entonces por la clase ProcessBuilder.
Saludos
ProcessBuilder
Hice la siguientes pruebas con ProcessBuilder,
1. genere un jar, un simple System.out.println("Test System out Funcionando desde jar");
a este jar lo estoy llamando desde otro
El error que me arroja es referente a aplicaciones Win32 ...
java.io.IOException: Cannot run program "C:/Users/Test_SystemOut.jar": CreateProcess error=193, %1 is not a valid Win32 application
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
at control_eventos.Main.main(Main.java:28)
Caused by: java.io.IOException: CreateProcess error=193, %1 is not a valid Win32 application
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.(ProcessImpl.java:188)
at java.lang.ProcessImpl.start(ProcessImpl.java:132)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021)
... 1 more
Continuare investigando como ejecutar un jar desde java....gracias nuevamente
El jar no es ejecutable
Por si solo un archivo JAR no puede ser ejecutable. Lo que puedes hacer es llamar a java (que si es ejecutable). Si usas windows quedaría así
ah pero por alguna razón (que no se cual) tienes que mandar a llamar al cmd de windows. entonces tienes que agregar
antes del llamado a java.exe
MMmmm echale un lente a este post, quizás te sirva si estas ejecutando otro programa en Java
TimerTask
Hay una cháchara que se llama TimerTask y te puede ayudar a disparar tareas en hilos independientes cada cierto intervalo de tiempo.
Échale un vistazo a la API de
Échale un vistazo a la API de concurrencia de Java, con la clase Executors puedes crear varios tipos de thread pools y hay de varios colores y sabores para que elijas cómo quieres que se comporte la ejecución de tus hilos. Échale un vistazo a esta entrada.
Esto en conjunto con el ProcessBuilder que ya te sugirieron, porque según entendí no quieres lanzar una sino varias ejecuciones del jar concurrentemente.
Saludos.
Pues ya de una vez un ejemplo
Pues ya de una vez un ejemplo sencillo y rápido de un newSingleThreadExecutor, según su descripción en la liga que te pasé es:
Y aquí el ejemplo, en este caso el thread pool recibe Runnables que imprimen "Pong!" y esperan dos segundos:
Es sólo un ejemplo, pero así puedes comenzar a jugar con los demás tipos de thread pools.
Saludos.
No funciona de la misma
No funciona de la misma manera que no funciona escribir en la linea de comandos directamente:
Tienes que escribir:
O bien escribir:
Si tu jar tiene un manifest especificando la clase principal.
Lo mejor con el ProcessBuilder es escribir cada opción como un string diferente, así:
:D
Ejecutar jar
Como mencionaste me funciono llamando antes el cmd, ya pude ejecutar un jar Externo.
Runtime.getRuntime().exec("cmd /c start java -jar C:/Users/Test_SystemOut.jar");
ahora me comentan que llamare diferentes jar, dependiendo de una variable numerica, ahora el problema que tengo es como podre identificar cual ejecucion de los jar esta bloqueada o tiene mas de X tiempo, para forzarla a cerrar. Desconozco si puedo obtener un id de cada jar que ejecute.
Gracias a todos por su apoyo,
No es necesario el "cmd"
No es necesario el "cmd" :
Corre bien así
Por cierto para que puedas
Por cierto para que puedas matar un proceso que se quedó colgado puedes utilizar el método: interrupt() de la clase thread...
¬¬
Bueno para no tener que escribir todo de nuevo, ve esta respuesta en StackOverflow:
Esta super interesante y muy sencilla.
Por cierto, esa respuesta viene usando Runtime.exec, pero desde la v1.5 ProcessBuilder es lo que se debe de usar.
Saludos.