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

Array de Threads

Estas en el tema de Array de Threads en el foro de Java en Foros del Web. Compañeros, tengo un problema y no se como solucionarlo, lo que pasa es que yo tengo una tabla en una base de datos donde un ...
  #1 (permalink)  
Antiguo 23/10/2009, 13:31
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Array de Threads

Compañeros, tengo un problema y no se como solucionarlo,

lo que pasa es que yo tengo una tabla en una base de datos donde un campo tiene unas direcciones IP, hago la consulta de las IP y debo conectarme vía FTP a dicha dirección. de FTP no hay nada de problemas, el problema es que a veces se demora mucho en conectarse a una dirección, o no se conecta (aunque a los no se cuantos milisegundos se cancela el intento de conexion), entonces decidí hacer un sistema de threads para la conexion, el problkema es que debo hacer unos procesos luego de haber conectado y DESCONECTADO de todas las ip, entonces no se como hacer esto. por favor alguien puede asesorarme?
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #2 (permalink)  
Antiguo 24/10/2009, 01:00
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Array de Threads

Hola,

Si solamente es necesario esperar que todos terminen hay que usar join()
Si se necesita mayor control sobre los Threads, se puede usar java.util.concurrent (awaitTermination(), etc)
Si es necesario que se comuniquen entre ellos, etc. la implementación es mas complicada, hay que crear una clase que funcione como monitor, el arreglo de threads, eventos (listeners), etc.

Saludos,
  #3 (permalink)  
Antiguo 25/10/2009, 10:23
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: Array de Threads

ummm, pero, mira, lo que tengo es esto:

Código java:
Ver original
  1. while(resultado.next()) {
  2.                 cencos = resultado.getString(1);
  3.                 dirip = resultado.getString(2).replaceAll(" ","");
  4.                 dirip = dirip.trim();
  5.                 new mithread(dirip,user,password,i).start();
  6.                 i++;
  7. }
  8. System.out.println("------TERMINO EL WHILE------");
  9. consolidar(ruta_destino,cencos,formateador.format(fecha));

en mithread hago una conexion al ftp, pero ese while es sobre una consulta de ips en la base de datos, y bueno, con datos exactos son 121 direcciones IP, cuando entro al mithread pongo esto:

Código java:
Ver original
  1. public void run(){
  2.         System.out.println("Empezo el thread "+i);
  3.         try {
  4.             FTP client = new FTP(server, user, pass);
  5.             client.cd("/");
  6.             client.setDataTransferType(FTP.BINARY);
  7.             System.out.println("Se conectó el thread "+i);
  8.             client.disconnect();
  9.         }
  10.         catch(Exception con){
  11.             System.out.println("NO se conectó el thread "+i);
  12.         }
  13.         System.out.println("Terminó el thread "+i+"\n");
  14.     }

entonces me muestra algo mas o menos asi:

Código:
Empezo el thread 1
Empezo el thread 2
Empezo el thread 3
Empezo el thread 4
Empezo el thread 5
Se conectó el thread 1
Se conectó el thread 2
Empezo el thread 5 6
....
....
Empezo el thread 121
------TERMINO EL WHILE------
Se conectó el thread 68
Se conectó el thread 73
...
...
entonces, cuando aparece "TERMINO EL WHILE" empieza a hacer lo que hay en el metodo "consolidar", pero aún no han terminado de ejecutarse COMPLETAMENTE los threads, empiezan, pero no terminan, y lo que necesito es que terminen, por que, aunque aun no está implementado, necesito descargar vía FTP unos archivos de cada servidor, y al momento de consolidar muchos servidores nisiquiera se han conectado, y se van a consolidar son los archivos que se descargan.

entonces necesito que consolidar se ejecute cuando ya mithread en su totalidad haya terminado, todos los 121 servidores ftp.

alguna ayuda?

la verdad no se y he buscado pero no encuentro nada que me ayude.


saludos.
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #4 (permalink)  
Antiguo 25/10/2009, 13:32
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Array de Threads

Hola,

En ese caso creo que lo mas simple es usar join.
Por ejemplo, pseudo-código:

Código Java:
Ver original
  1. Thread[100] lista;
  2. int i = 0;
  3.  
  4. while (resultado.next()) {
  5.   lista[i] = new Thread();
  6.   lista[i++].start();
  7. }
  8.  
  9. for (Thread a : lista) {
  10.   a.join();
  11. }
  12.  
  13. System.out.println("100 threads done");
Este ejemplo no corre, y no funcionaría por la cantidad de next(), es solamente una idea para implementarla con Collections sincronizados.

Ahora bien, en ese caso es porque no hay mayor interactividad de los threads ni con otro componente, ni entre ellos mismos. El thread principal, el que esta ejecutando la aplicación se detiene a esperar a cada uno de los threads por medio de 'unirse' con cada uno.

Si deseas que cada uno de los threads avise de su status al thread principal, o se comuniquen entre ellos, la programación es mucho mas complicada, puesto que tienes que implementar interfaces para que envien eventos (listeners), y agregarlos todos a una lista.

Creo tener todavía una implementación de un servidor de IRC (Chat) que maneja las conexiones por medio de threads, si la encuentro te muestro aquí como está implementada para que puedas adaptarla.

Saludos,

ps:

Un ejemplo de join : http://javahowto.blogspot.com/2007/0...n-threads.html
  #5 (permalink)  
Antiguo 26/10/2009, 07:10
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: Array de Threads

Cita:
Este ejemplo no corre, y no funcionaría por la cantidad de next(), es solamente una idea para implementarla con Collections sincronizados.
bueno, pero lo que dices aca es por que el resultado me va a traer 121 y tu lo inicias en 100?
si es por eso, se soluciona primero haciendo una consulta de cuantos registros hay y asignandoselos.

ahora, yo no quiero que los threads se esperen unos a los otros, solo quiero que
"System.out.println("100 threads done");" se ejecute cuando ya todos los threads hayan terminado, no importa cual haya empezado primero, sino que hayan empezado, se hayan ejecutado y hayan terminado TODOS.

otra cosa, Thread[100] lista; me sale error, que no hay que definir la cantidad despues?

no se, me sale error.
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #6 (permalink)  
Antiguo 26/10/2009, 12:41
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: Array de Threads

Solucionado!!!

Al final me quedo así:

Código java:
Ver original
  1. int registros = totalIPs();
  2. mithread[] lista = new mithread[registros];
  3. int i = 0;
  4. while (resultado.next()) {
  5.    cencos = resultado.getString(1);
  6.    dirip = resultado.getString(2).replaceAll(" ","");
  7.    dirip = dirip.trim();
  8.    lista[i] = new mithread(dirip,user,pass,ruta_destino);
  9.    lista[i].start();
  10.    i++;
  11. }
  12. for (Thread a : lista) {
  13.    try {
  14.       a.join();
  15.    }
  16.    catch (InterruptedException ex) {
  17.       info_correo+="Error al esperar la ejecucion de Threads.\n";
  18.    }
  19. }
  20. consolidar(ruta_destino,cencos,formateador.format(fecha));

Teniendo en cuenta que mithread es la clase donde realizo el proceso de conexión, blablabla.

Muchas gracias compañero HackmanC
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #7 (permalink)  
Antiguo 26/10/2009, 15:55
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Array de Threads

Hola,

Cita:
Iniciado por lobo_php Ver Mensaje
... otra cosa, Thread[100] lista; me sale error, que no hay que definir la cantidad despues?

no se, me sale error.
Je, je ... seguramente. Voy a revisar de nuevo los manuales, lo escribí así porque en algún manual de C, C++ o Java, leí que es aconsejable declarar la dimensión en el tipo de datos y no en la variable. Por ejemplo:

public static void main (String[] args)
En el lugar de:
public static void main (String args[])

Y siempre se me confunde ... así que como no hice pruebas, solamente te indiqué que era pseudo-código aunque pareciera Java.



También te aconsejé usar Collections porque no era necesario saber el tamaño del array con anterioridad.
Pseudo-codigo:
Código Java:
Ver original
  1. ArrayList<Thread> t = new ArrayList<Thread>();
  2. t.add(new Thread());
  3. t.add(new Thread());
  4. t.add(new Thread());
  5. for (Thread a : t) { a.start(); }
Pero es bueno saber ya lo tienes solucionado y funcionando.

Saludos,
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 18:30.