elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Sincronizar Threads
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Sincronizar Threads  (Leído 6,610 veces)
alzehimer_cerebral


Desconectado Desconectado

Mensajes: 513



Ver Perfil WWW
Sincronizar Threads
« 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


En línea

Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com
alzehimer_cerebral


Desconectado Desconectado

Mensajes: 513



Ver Perfil WWW
Re: Sincronizar Threads
« Respuesta #1 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


En línea

Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com
Leyer


Desconectado Desconectado

Mensajes: 786


leyer@elhacker.net


Ver Perfil WWW
Re: Sincronizar Threads
« Respuesta #2 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.
« Última modificación: 21 Abril 2010, 18:55 pm por LEYER » En línea

alzehimer_cerebral


Desconectado Desconectado

Mensajes: 513



Ver Perfil WWW
Re: Sincronizar Threads
« Respuesta #3 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
En línea

Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com
Leyer


Desconectado Desconectado

Mensajes: 786


leyer@elhacker.net


Ver Perfil WWW
Re: Sincronizar Threads
« Respuesta #4 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.
« Última modificación: 21 Abril 2010, 21:24 pm por LEYER » En línea

alzehimer_cerebral


Desconectado Desconectado

Mensajes: 513



Ver Perfil WWW
Re: Sincronizar Threads
« Respuesta #5 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
En línea

Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com
Leyer


Desconectado Desconectado

Mensajes: 786


leyer@elhacker.net


Ver Perfil WWW
Re: Sincronizar Threads
« Respuesta #6 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.
« Última modificación: 21 Abril 2010, 21:41 pm por LEYER » En línea

alzehimer_cerebral


Desconectado Desconectado

Mensajes: 513



Ver Perfil WWW
Re: Sincronizar Threads
« Respuesta #7 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
En línea

Servicios Informaticos Valencia - www.ag-solutions.es
Mi blog - www.alvarogarciasolano.com
Leyer


Desconectado Desconectado

Mensajes: 786


leyer@elhacker.net


Ver Perfil WWW
Re: Sincronizar Threads
« Respuesta #8 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

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
sincronizar carpetas con el servidor
Windows
OssoH 2 3,955 Último mensaje 3 Mayo 2011, 20:54 pm
por OssoH
Sincronizar carpeta en la nube.
Software
Aikanáro Anário 2 2,967 Último mensaje 20 Octubre 2011, 20:50 pm
por Aikanáro Anário
itunes 10 se cuelga al sincronizar
Foro Libre
franfis 0 1,385 Último mensaje 27 Agosto 2013, 01:03 am
por franfis
Sincronizar hora en red LAN
Redes
virtualedu 8 9,167 Último mensaje 11 Diciembre 2013, 16:12 pm
por Platanito Mx
onedrive y sincronizar
Software
huerto123 1 1,468 Último mensaje 22 Octubre 2023, 14:25 pm
por xv0
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines