Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Threads

Estas en el tema de Threads en el foro de Java en Foros del Web. Tengo un hilo de ejecución principal, el cual es el primero que se empieza a ejecutar, que ejecuta métodos de distintas clases. Uno de esos ...
  #1 (permalink)  
Antiguo 19/05/2015, 13:27
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 1 mes
Puntos: 31
Threads

Tengo un hilo de ejecución principal, el cual es el primero que se empieza a ejecutar, que ejecuta métodos de distintas clases.

Uno de esos métodos genera un nuevo hilo de ejecución (new thread) el cual accede también a métodos que ya habían sido usados por mi hilo de ejecución principal.
Incluso en un punto dado este segundo hilo ejecuta el método que genera un nuevo hilo, generando un tercer hilo de ejecución.

En ese caso en el que un hilo de ejecución depende de otro... como se gestiona esto? Aunque sea el hilo secundario el que ha generado el tercer hilo... son hilos independientes a la hora de ser tratados por la máquina virtual?



Y ya que planteado así puede llegar a generarse un bucle muy grande (no infinito pero si muy muy grande de número de hilos)... habría alguna manera de generar algo así como una pila de hilos activos con un máximo, y una cola de hilos que según se vayan terminando los de la pila, los nuevos puedan ir entrando?

Y si no... como se podrían llegar a gestionar?

Y por último una última pregunta:

En mi caso, la generación de un nuevo hilo (el tercero) es la última instrucción de este primer hilo auxiliar(el segundo hilo en realidad). En este caso... significa que hasta que no acabe ese tercero no termina el segundo, o el segundo activa el tercero y continúa la línea de ejecuciones y como no hay más el segundo muere, dejando al tercero activo? Como funcionan en este caso?

PD: En el código del nuevo hilo, tengo la línea que genera nuevos hilos comentada, y no me atrevo a activarla... aún no la he probado. Además, cada hilo auxiliar (el que no es el principal) desde el primer auxiliar lee de una BBDD, la actualiza y añade registros.

Última edición por Kritik; 19/05/2015 a las 13:43
  #2 (permalink)  
Antiguo 20/05/2015, 07:36
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 1 mes
Puntos: 31
Respuesta: Threads

acabo de descubrir el método wait del objeto thread. Quizá esto me pueda ayudar, de forma que pueda poner que entre la ejecución de un hilo y otro de los que no son el principal puedan pasar incluso minutos.

Pero... sigo sin aclararme del todo. Acabo de darme cuenta de que mi hilo principal genera el primer hilo secundario... pero no espera a que ese hilo secundario termine, él le manda la orden .start... y cuando el otro empieza a ejecutarse, la orden de start ya está finalizada y por lo tanto el hilo principal continúa su ejecución normal... mientras que el secundario empieza a trabajar.

Y seguramente entonces pasará lo mismo cuando el hilo secundario llegue a generar un tercer hilo... el secundario generará un tercer hilo y en cuanto ese tercero empiece... el segundo seguirá ejecutando órdenes.

Mi profesor me ha comentado la posibilidad de generar una clase que sea la que controle los hilos. Es necesaria? Aconsejable?

Como puedo hacer para que cada hilo averigue si hay uno posterior... y en el caso de haberlo informarle de cuando ese hilo acaba, y como puedo hacer para que en el hilo posterior, averiguar si existe uno anterior, y en el caso de existir espere a que ese anterior le informe de que ha acabado?

Lo digo porque cada hilo hace consultas SQL, luego navega por internet (y en eso puede llegar a tardar incluso minutos, pues puede llegar a navegar por muchas páginas no simultáneamente, sino una después de otra... y después escribe los resultados de esas búsquedas en mi BBDD. Y dependiendo de esos resultados pueden generar más hilos.

Y por eso necesito controlarlos, porque mientras que el primero acaba (si por ejemplo tarda 20 segundos), habrá generado otro hilo, y ese otro, y ese otro... imagínate en 20 segundos... pufff... millones.
  #3 (permalink)  
Antiguo 20/05/2015, 08:54
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Threads

Buenas,

Me parece que es el metodo join() el que te interesa.
https://docs.oracle.com/javase/7/doc...ead.html#join()

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #4 (permalink)  
Antiguo 20/05/2015, 16:42
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 1 mes
Puntos: 31
Respuesta: Threads

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Buenas,

Me parece que es el metodo join() el que te interesa.
https://docs.oracle.com/javase/7/doc...ead.html#join()

Un saludo
El join() se refiere al tiempo de vida máximo de un thread (por lo que puedo traducir). Y si se pone 0 no se acaba nunca aunque acabe con sus instrucciones. Se quedaría como a la espera (ocupando memoria) y podríamos matar o manejar el thread desde otra parte de nuestro código. No es lo que busco.

He averiguado algunas cosas sobre el objeto thread:
-Los hilos tienen un nombre que es "Thread-X", donde X es el número del hilo.
-Cuando un hilo muere, su nombre queda libre. Ej si están corriendo Thread-1, Thread-2,Thread-3 y Thread-2 termina de ejecutarse y muere... el siguiente hilo que se cree tomará el nombre Thread-2... y si luego se crea otro sería Thread-4.

-hay un modo de ejecutar los métodos llamado "synchronized". Al indicar en un método con esa palabra que está sincronizado, solo 1 hilo a la vez puede ejecutarlo. Sin embargo, el único sitio donde me sirve es en el propio void run que inicia la ejecución del hilo, de forma que al tener múltiples hilos, y todos ejecutar la instrucción start... todos irían a ese método sincronizado void run... pero resulta que eso no funciona, y varios hilos se me ejecutan al mismo tiempo. He probado en otros sitios de mi código y en ninguno parece que funcione.

Se me ha ocurrido crear un void en la misma clase que la clase que tiene el void run de mis hilos secundarios..., y pasar todo el código del void run a ese void. Ese otro void le he puesto synchronized... y aun así no los sincroniza, todos mis hilos lo ejecutan al mismo tiempo. (He llegado a tener 32 hilos antes de que empiecen a dar problemas de memoria).

- Existe un método wait(X) que hace esperar en un máximo de 99.999 (aunque en los docs dice 999.999 lo he provado y da error con más de 99.999) milisegundos. En el caso de no indicar tiempo, el tiempo será indefinido hasta que otro hilo envíe a este un Notify.

- De momento lo que se me ocurre es utilizar el wait y la propiedad del nombre del hilo para controlarlos. Pero es bastante complicado trabajar con los nombres.

Cualquier tipo de información extra que me aporten será bien recibida.

Última edición por Kritik; 20/05/2015 a las 17:01
  #5 (permalink)  
Antiguo 21/05/2015, 00:43
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Threads

Buenas,

Cita:
El join() se refiere al tiempo de vida máximo de un thread
No se de donde has sacado esa definicion pero join es la respuesa a lo que decias en tu segundo post:

Cita:
Acabo de darme cuenta de que mi hilo principal genera el primer hilo secundario... pero no espera a que ese hilo secundario termine
Cuando haces un desde un hilo un join a otro hilo lo que hace es esperar a que este ultimo termine.


Ahora bien, en cada post pareces decir cosas diferentes, asi que la verdad es que no entiendo cuales pueden ser tus necesidades.

Con este tutorial te deberia quedar todo claro:
http://www.programcreek.com/java-threads/


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #6 (permalink)  
Antiguo 21/05/2015, 01:35
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 1 mes
Puntos: 31
Respuesta: Threads

Mis necesidades son equivalentes al siguiente ejemplo:
Ponte que en una base de datos tengo los siguientes campos: número not null, múltiplo1 null, multiplo2 null , múltiplo3 null.
Mi hilo principal tiene un método de búsqueda de valores en el campo número. Y en el caso de no encontrarlo, lo inserta por medio de otro método.

Cada vez que mi hilo principal inserta un registro en este segundo método, lo único que inserta son valores para número, pero no inserta valores en los campos múltiplo.

Cada vez que hace una inserción arranca un hilo secundario. Ese hilo secundario busca registros con campo número, y que multiplo1 sea null. Cuando encuentra uno hace los cálculos y hace un update al registro, metiéndole los valores multiplo1,multiplo2,y múltiplo3.

Hasta aquí no hay problema, ha actualizado un registro.

El problema es cuando yo en ese hilo secundario he guardado una lista con los valores múltiplo1,multiplo2 y multiplo3. Y entonces decido llamar al método de búsqueda en el que hago las búsquedas de esos valores múltiplos como valores de número. Para ver si esos múltiplos tienen sus registros propios.

En este caso, cada vez que hago esa búsqueda va generar un nuevo registro con el valor numero cuyo valor es el multiplo1 del registro anterior. Pero también va a generar una nueva inserción de otro registro para el valor numero con el valor multiplo2 del registro origen. Y luego también va a generar un nuevo registro para el valor numero con el valor multiplo3 del registro origen. Y como dije al principio, cada vez que se inserta un nuevo valor se genera un nuevo hilo que calcula los múltiplos, así que en este momento voy a generar 3 nuevos hilos para actualizar esos 3 valores...
Además del problema añadido de que cada nuevo hilo va a recoger los 3 registros que tienen valores en numero pero no en múltiplo y cada uno de los 3 hilos va a generar 9 nuevos registros... (provocando repeticiones de registros en mi BBDD) también tengo el problema de que el número de hilos va creciendo exponencialmente.
  #7 (permalink)  
Antiguo 21/05/2015, 16:42
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 1 mes
Puntos: 31
Respuesta: Threads

No me hace exactamente lo que quiero hacer, pero creo que es un principio...
while (Thread.activeCount()<=N)// (N es el número de hilos que tengo de serie, y así cuando el secundario es creado ya no volverá a entrar más en el while hasta que el secundario no acabe y muera)
{
clase nombre_objeto= new clase();
nombre_objeto.start();
}
Controlo en número de hilos activos, de forma que puedo tener única y exclusivamente 1 hilo secundario.

Creo que de esta forma me puedo apañar y conseguir lo que quiero. Pero ahora la pregunta es:

Si de esta forma solo voy a tener un hilo secundario que me haga lo que he explicado en mi anterior post... no podría hacer un Thread que no esté instanciado, que ejecute 1 método estático?

La idea ahora es, haciendo un segundo hilo sin instanciar, que este ejecute:

Metodo 1: Si hay números que no tengan rellenos sus campos múltiplos calcúlalos y actualiza registros.
Metodo 2: Si hay múltiplos que no existan como números en su propio registro créalos.
Cambia de método 1 a método 2 hasta que ninguno tenga nada que hacer.

Seguiré informando.

Última edición por Kritik; 21/05/2015 a las 16:49

Etiquetas: clase, threads
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:39.