Foro de elhacker.net

Programación => Java => Mensaje iniciado por: alzehimer_cerebral en 21 Abril 2010, 17:07 pm



Título: Sincronizar Threads
Publicado por: alzehimer_cerebral en 21 Abril 2010, 17:07 pm
Hola a todos de nuevo,

he leido articulos de sincronizacion de threads sin encontrar lo que busco.

Mi programa tiene el thread principal correspondiente al main, llega un momento en el cual necesito descargar un fichero de un servidor y hasta que dicho fichero no se descargue la ejecucion del programa no puede seguir.

Para gestionar la descarga lo hago mediante una clase que extiende a Thread, como puedo parar el thread principal del programa???

Asi es como lo estoy intentando:

Código
  1. Thread th =null;
  2.  
  3.        th = Thread.currentThread(); // We suspend the main thread
  4.  
  5.        try {
  6.            th.sleep(1000);
  7.        } catch (InterruptedException ex) {
  8.            Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
  9.        }
  10.  
  11.        th.yield();
  12.  
  13.        /**try {
  14.             Thread.sleep(10000);
  15.         } catch (InterruptedException ex) {
  16.             Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
  17.         }
  18.             Thread.yield();
  19.  
  20.             **/
  21.        ThreadForDownload thread = new ThreadForDownload(urli,global.GlobalApplicationDirectories.defaultRepositoriesPath);
  22.        thread.start();
  23.  
  24.  
  25.            //thread.start();
  26.            //Aqui quiero frenar la ejecucion hasta que thread termine de hacer la descarga
  27.  
  28.        //Aqui quiero frenar la ejecucion hasta que thread termine de hacer la descarga
  29.  
  30.        System.out.println("Despues ThreadForDownload");
  31.  
  32.  

He visto como sincronizar dos metodos que son synchronized, pero claro no se como hacer el thread principal de este tipo...

No se si me explicado bien, cualquier cosa me decis.

Gracias de antemano.

alzehimer_cerebral


Título: Re: Sincronizar Threads
Publicado por: alzehimer_cerebral en 21 Abril 2010, 18:08 pm
Haber os comento,

el thread del main lo he puesto como synchronized:

Código
  1. public static void main(String args[]) {
  2.        java.awt.EventQueue.invokeLater(new Runnable() {
  3.  
  4.            public synchronized void run() {
  5.                Gui gui=new Gui();
  6.                gui.setVisible(true);
  7. }
  8.  
  9.  

Si duermo el proceso principal funciona:

Código
  1. Thread th =null;
  2.  
  3.        th = Thread.currentThread(); // We suspend the main thread
  4.  
  5.        ThreadForDownload thread = new ThreadForDownload(urli,global.GlobalApplicationDirectories.defaultRepositoriesPath);
  6.        thread.start();
  7.        try {
  8.            th.sleep(1000);
  9.        } catch (InterruptedException ex) {
  10.            Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
  11.        }
  12.  

Pero supongamos que el servidor de donde se descarga el fichero esta saturado y tarda mas de 1seg en descargar el fichero, entonces ya no funcionaria con el sleep(1000)...

Me gustaria dejar th en wait y que ThreadForDownload haga un notifyAll para que lo despierte, pero cuando hago eso me salta la siguiente excepcion:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException


Título: Re: Sincronizar Threads
Publicado por: Leyer en 21 Abril 2010, 18:25 pm
Mira este ejemplo que hice

Otra cosa ya no habias preguntado sobre esto creo que el otro hilo te lo habiamos solucionado.


Código
  1. class Thread_ extends Thread{
  2. private  GUI gui = null;
  3. public Thread_(GUI gui){
  4. this.gui = gui;
  5. }
  6. @Override
  7. public synchronized void run(){
  8. try {
  9. Thread.sleep(2000);
  10. synchronized (gui) {
  11. gui.notify();
  12. }
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. }
  18. public class GUI {
  19. public synchronized void download() throws InterruptedException{
  20. Thread_ thread_ = new Thread_(this);
  21. thread_.start();
  22. this.wait();
  23. }
  24. public static void main(String args[]) {
  25. try {
  26. new GUI().download();
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }

Un Saludo.


Título: Re: Sincronizar Threads
Publicado por: alzehimer_cerebral en 21 Abril 2010, 19:37 pm
Si habia preguntado algo parecido, pero el codigo que me has puesto me ayuda todavia mas...  De todas formas he optado en no usar un thread para la descarga ya que si la ejecucion del programa al final es secuencial no tiene mucho sentido..

Que opinas LEYER??

Salu2

alzehimer_cerebral


Título: Re: Sincronizar Threads
Publicado por: Leyer en 21 Abril 2010, 20:09 pm
Si habia preguntado algo parecido, pero el codigo que me has puesto me ayuda todavia mas...  De todas formas he optado en no usar un thread para la descarga ya que si la ejecucion del programa al final es secuencial no tiene mucho sentido..

Que opinas LEYER??

Salu2

alzehimer_cerebral

Cierto, pero tienes que considerar en este caso que si no usas un hilo y tu programa es secuencial , habria problemas en tu interfaz ya que se congelaria hasta que finalize el proceso de descarga, aunke cuando haces wait en la GUI quisas pasara lo mismo habria que aplicar un poco mas de logica en ese caso.

Un Saludo.


Título: Re: Sincronizar Threads
Publicado por: alzehimer_cerebral en 21 Abril 2010, 21:06 pm
Que se podria hacer para que no se congelase la GUI, mi inexperiencia con threads no me permiten barajar otras opciones a la que previamente me comentaste.

Un saludo.

alzehimer_cerebral


Título: Re: Sincronizar Threads
Publicado por: Leyer en 21 Abril 2010, 21:30 pm
Si tienes un proceso muy largo como descargar un archivo, es recomendado usar un hilo que haga esa tarea, ya que si lo colocas supongamos dendro del constructor de la class par la GU todos los componentes estaras congelados hasta que el proceso termine , como tu estas diciendo que lo vas a ser secuencial y todo estara en un solo proceso gui y descarga esto congelara la gui hasta que termine el proceso sin dudas.

Un Saludo.


Título: Re: Sincronizar Threads
Publicado por: alzehimer_cerebral en 21 Abril 2010, 22:14 pm
Pero si separo la descarga en otro thread entonces la GUI no se quedara congelada..

Es eso lo que quieres decir??

alzehimer_cerebral


Título: Re: Sincronizar Threads
Publicado por: Leyer en 21 Abril 2010, 22:41 pm
Pero si separo la descarga en otro thread entonces la GUI no se quedara congelada..

Es eso lo que quieres decir??

alzehimer_cerebral

Claro