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

Limitar Threads

Estas en el tema de Limitar Threads en el foro de Java en Foros del Web. Buenas, estoy haciendo un programa mediante threads que dado links, los descarga y posteriormente los procesa. El problema es que lanzo aproximadamente unos 500 simultaneos ...
  #1 (permalink)  
Antiguo 25/09/2008, 01:52
 
Fecha de Ingreso: enero-2007
Mensajes: 78
Antigüedad: 17 años, 3 meses
Puntos: 0
Limitar Threads

Buenas, estoy haciendo un programa mediante threads que dado links, los descarga y posteriormente los procesa. El problema es que lanzo aproximadamente unos 500 simultaneos y se trata en gran parte manejo de ficheros por lo que el ordenador se colapsa, sin embargo si lo lanzo para un numero limitado de links funciona correctamente.


Lo que me gustaría hacer sería algo asi(en pseudocodigo):

while (contador < NuneroURL)
si (threads activos < 10)
contador++;
Thread hijo = new ClaseThread(URL, contador, direc);
hijo.start();

A ver si alguien sabe alguna manera. Saludos y gracias.
  #2 (permalink)  
Antiguo 25/09/2008, 02:30
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Mensaje Respuesta: Limitar Threads

Hola,

Sincronización.
Lee la documentación.


De esta forma lo haría yo ...
Mi clase principal se encarga de manejar los threads y los threads le avisan.

Código:
public class Principal() {
  private int cuenta;
  public synchronized void incCuenta() {
    cuenta++; // Cuando 1 thread inicializa incrementa la cuenta.
  }
  public synchronized void decCuenta() {
    cuenta--; // Cuando 1 thread finaliza decrementa la cuenta.
  }
  public Principal() {
    new MiThread(this).start();
    new MiThread(this).start();
    System.out.println(cuenta);
  }
}

public class MiThread extends Thread {
  private Principal p;
  public MiThread(Prinicipal p) {
    this.p = p;
    this.p.incCuenta(); // En el constructor agrega 1 a la cuenta
  }
  public void run() {
    // hacer todo el proceso del thread.
    Sleep(1000 * 60);
    this.p.decCuenta(); // Esta función reduce la cuenta
  }
}
Y para eliminar el while (cuenta < 10) ... usaría wait y notify.

Saludos.

ps:
* Es un concepto parecido a los listeners
* El código arriba puede tener errores.
  #3 (permalink)  
Antiguo 26/09/2008, 01:57
 
Fecha de Ingreso: enero-2007
Mensajes: 78
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: Limitar Threads

Ante todo gracias HackmanC. He estado intentando poner en marcha tu codigo, antes de meterme en lo que viene siendo el programa en si, pero no me explico porque no logro hacer que funcione. A ver si alguien me puede hechar un cable.

Principal.java
Código PHP:
public class Principal {

    private 
int cuenta;
    public 
synchronized void incCuenta() {
        
cuenta++; // Cuando 1 thread inicializa incrementa la cuenta.
    
}
    public 
synchronized void decCuenta() {
        
cuenta--; // Cuando 1 thread finaliza decrementa la cuenta.
    
}
    
    public 
Principal() {
        
Thread hijo = new MiThread(this);
        
hijo.start();
        
System.out.println(cuenta);
  }    

MiThread.java
Código PHP:
public class MiThread extends Thread {
    private 
Principal p;
    public 
MiThread(Principal p) {
        
this.p;
        
this.p.incCuenta(); // En el constructor agrega 1 a la cuenta
    
}


    public 
void run() {
        
// hacer todo el proceso del thread.
        //Sleep(1000 * 60); ESTA COMENTADO PORKE EL COMPILADOR NO ME RECONOCE EL SLEEP
        
this.p.decCuenta(); // Esta función reduce la cuenta
      
}

Bueno finalmente compila pero al ejecutar me salta la excepcción(Exception in thread "main" java.lang.NoSuchMethodError: main)

Saludos y gracias.
  #4 (permalink)  
Antiguo 26/09/2008, 12:56
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Mensaje Respuesta: Limitar Threads

Hola,

Será que le hace falta el main ?

Código:
public class Principal {
  public static void main (String[] args) {
    new Principal();
  }
  ....
}
Saludos.
  #5 (permalink)  
Antiguo 29/09/2008, 09:24
 
Fecha de Ingreso: enero-2007
Mensajes: 78
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: Limitar Threads

Ante todo, pido perdon por la santa tontería que pregunté el otro día..., la del main.

He implementado el codigo que el me paso HackmanC para controlar que solo tengamos 10 Threads activos en cada momento, puede ser una tontería pero supongo que a alguien en algun momento de su vida lo necesitará.

Saludos y gracias!

Princiapl.java
Código PHP:
public class Principal {

    private 
int cuenta 0;
    public 
synchronized void incCuenta() {
        
cuenta++;
         
// Cuando 1 thread inicializa incrementa la cuenta.
    
}
    public 
synchronized void decCuenta() {
        
cuenta--; 
        
// Cuando 1 thread finaliza decrementa la cuenta.
    
}
    
    public 
synchronized void limitarThread() {
           while (
cuenta == 10) {
                   try {
                
System.out.println("esperando wait");
                    
this.wait();
                }catch (
InterruptedException e) {}
            }

        
    }

    public 
synchronized void desbloquearThread() {
        
this.notifyAll();             
    }


    
    public 
Principal() {
        
int contador 0;
        while (
contador30){
            
System.out.println("p1");
            
this.limitarThread();
            
this.incCuenta();
            
Thread hijo = new MiThread(this);
            
hijo.start();
            
System.out.println(cuenta);
            
contador++;
        }
    }    
public static 
void main(String[] args){
    new 
Principal();}} 
MiThread.java
Código PHP:
public class MiThread extends Thread {
    private 
Principal p;
    public 
MiThread(Principal p) {
        
this.p;//this.p.incCuenta(); // En el constructor agrega 1 a la cuenta
    
}


    public 
void run() {
    
    
    try{
sleep(100 60);}
    catch(
InterruptedException ie){
    
ie.printStackTrace();
    }
    
this.p.decCuenta(); // Esta función reduce la cuenta
    
this.p.desbloquearThread();
        
    
      }


Última edición por Belzebu; 29/09/2008 a las 09:40
  #6 (permalink)  
Antiguo 29/09/2008, 11:57
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Limitar Threads

Desde Java 5, el paquete java.util.concurrent tiene utilidades para encargar tareas a un numero limitado de Threads, etc. En tu caso lo que buscas creo que se podría hacer con Executor.

http://java.sun.com/developer/techni...E/concurrency/
http://www.particle.kth.se/~lindsey/...encyTools.html
http://java.sun.com/docs/books/tutor...y/exinter.html

Siempre esta bien hacerlo a mano, pero si te lo dan hecho, mejor aun .

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
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 00:11.