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

[SOLUCIONADO] Hilo isRunning()

Estas en el tema de Hilo isRunning() en el foro de Java en Foros del Web. Buenas tardes compañeros, no suelo postear mucho pero aqui traigo una duda, a ver si me sabeis solucionar. Tengo una aplicación hecha en hilos y ...
  #1 (permalink)  
Antiguo 08/08/2014, 08:17
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Hilo isRunning()

Buenas tardes compañeros, no suelo postear mucho pero aqui traigo una duda, a ver si me sabeis solucionar.

Tengo una aplicación hecha en hilos y me ha surgido un problema.

En la aplicación (MAIN) tengo lo siguiente.

Código PHP:
// Añadimos los botones de interacción que podrá usar el usuario
        
Ejecutar = new JButton();
        
Ejecutar.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent e) {
                
//timer2.start();
                
quitarAlways(false);
                
= new Contador();
                
Hilo = new Thread(C);
                
Hilo.start();
                while (
C.isRunning()){
                    
                }
                
timer2.start();
                
/*while (C.mRun==false){
                }
                timer2.start();
                }*/
            
}
        });
        
Ejecutar.setText("Ejecutar");
        
Ejecutar.setBounds(102308223);
        
contentPane.add(Ejecutar); 
Lo que trato de conseguir es, que al ejecutar este botón, se inicie un JFrame con un contador de 5 segundos que es otro hilo y, esta aplicación se quede en espera mientras, el problema es que se queda congelada y no responde.

Código PHP:
package AutoClick2;

import java.awt.Dimension;

@
SuppressWarnings("serial")
public class 
Contador extends JFrame implements RunnableActionListener {
    private 
boolean continuar true;
    public 
boolean  mRun=true;
    
int t=5;
    private 
JLabel PosicioneElPuntero;
    private 
JLabel c;
    
/**
     * Launch the application.
     */
    
public static void main(String[] args) {
        
/*Contador c = new Contador();
        Thread Hilo = new Thread(c);
        Hilo.start();*/
    
}
    
/**
     * Create the frame.
     */
    
public Contador() {
        
this.objs();
        
// Propiedades del JFrame
        
this.setTitle("Contador");
        
this.setLocation(new Point(580280));
        
this.setSize(new Dimension(209,110));
        
this.setVisible(true);
        
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
this.setResizable(false);
        
this.getContentPane().setLayout(null);
    }

    public 
void objs() {
        
= new JLabel(""+t);
        
c.setBounds(100,11,60,20);
        
getContentPane().add(c);
        
        
PosicioneElPuntero = new JLabel("Posicione el puntero de su ratón");
        
PosicioneElPuntero.setBounds(104219114);
        
getContentPane().add(PosicioneElPuntero);
    }
    
    public 
void detenElHilo() throws InterruptedException{
        
continuar=false;
        
mRun false;
        
dispose();
    }

    public 
boolean isRunning(){
        return 
mRun;
    }
    
    public 
void run (){
        try {
            while (
continuar==true){
                
t-=1;
                
c.setText(""+t);
                
Thread.sleep(1000);
                if (
t==0){
                    
detenElHilo();
                }
            }
        }catch (
Exception e){}
    }
    public 
void actionPerformed(ActionEvent arg0) {
    }

No se porqué se queda congelada la aplicación, supongo que algo falta, pero tampoco se muy bien el que...
  #2 (permalink)  
Antiguo 08/08/2014, 09:30
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Hilo isRunning()

Hola:

Java tiene un hilo de despacho de eventos (EDT) que es el hilo que se encarga de manejar todos los eventos de teclado, de ratón y de pintar las ventanas. Si ese hilo se queda bloqueado, las ventanas no responden y no se repintan.

En tu caso, java ejecuta el actiponPerformed() en ese hilo, puesto que es un evento de click en una ventana. Es posible que estás bloqueando ese hilo con el while(c.isRunning()). Ten en cuenta, por ejemplo, que la visualización de la ventana Contador y el c.setText() también tratan de ejecutarse en ese hilo EDT que en ese momento está en tu actionPerformed().

La solución suele ser meter todo el código de actionPerformed en un Runnable y lanzarlo como hilo aparte, de forma que no bloquees el actionPerformed y salga lo antes posible.

Más detalles aquí http://chuwiki.chuidiang.org/index.p...hread)_de_Java

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 08/08/2014, 11:07
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Hilo isRunning()

Vale, entendí lo que me decías XDD

Pero el problema es el siguiente:

Código PHP:
// Añadimos los botones de interacción que podrá usar el usuario
        
Ejecutar = new JButton();
        
Ejecutar.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent e) {
                
quitarAlways(false);
                
System.out.println("Running");
                
// Instancio la clase "Contador" como nuevo hilo para controlar su funcionamiento
                
Contador C = new Contador() {
                    public 
void run() {
                        try {
                            
// Mientras "Contador" esté funcionando, esta clase esta a la espera de que termine
                            
while (C.isRunning()){
                            }
                            
timer2.start();
                        } catch (
Exception e){
                            
e.printStackTrace();
                        }
                    }
                };
                
Thread Hilo = new Thread(C);
                
Hilo.start();
            }
        });
        
Ejecutar.setText("Ejecutar");
        
Ejecutar.setBounds(102308223);
        
contentPane.add(Ejecutar); 
El problema esta en Contador C = new Contador() {} -> Me dice lo siguiente:

http://www.anony.ws/i/2014/08/08/Capturadepantalla2014-08-0819.08.42.png

Entonces si añado serial o le pongo a C como final, me dice que sigue dando error...La verdad, que no se como solucionarlo.

Última edición por yesod91; 08/08/2014 a las 11:23
  #4 (permalink)  
Antiguo 08/08/2014, 12:39
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Hilo isRunning()

Hola:

Lo del Serial es un warning y no tiene nada que ver con que se quede colgada la pantalla.

Aquí tienes algo más sobre lo del serial, por si tienes curiosidad, en el apartado 4 http://chuwiki.chuidiang.org/index.p...bjetos_en_java

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 08/08/2014, 13:00
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Hilo isRunning()

Pero el tema, es que ahora, el contador ahora no me funciona, se me queda pillado en el inicio y nunca finaliza
  #6 (permalink)  
Antiguo 08/08/2014, 13:30
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Hilo isRunning()

Este tipo de espera

while (C.isRunning()){

}

que no hace nada consume mucho tiempo y posiblemente deje pillado todo. Pon un sleep dentro.

De todas formas, para esperar por un hilo, se usa tuHilo.join() http://docs.oracle.com/javase/7/docs...ad.html#join()

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 08/08/2014, 13:37
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Hilo isRunning()

Si el tema es que necesito que sea el método isRunning para que se quede a la espera hasta que el contador finalice, porque si por lo que sea, el contador lleva mas tiempo del debido o menos en su defecto, con un sleep no funcionaría correctamente
  #8 (permalink)  
Antiguo 08/08/2014, 22:46
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Hilo isRunning()

Hola:

Cuando el contador finaliza, el hilo termina. Da igual esperar por isRunning() que hacer un join(), salvo por la direrencia de que while(isRunning()){} es una "espera activa" que consume muchos recursos y puede dejar a otros hilos pillados.

Tienes que dejar el contador y todo igual, pero en vez de while(C,isRunning()){} pon C,join().

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #9 (permalink)  
Antiguo 09/08/2014, 04:33
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Hilo isRunning()

El problema es que C.join() no me deja ponerlo, no me da la opción...la opción de isRunning() la tuve que crear yo a mano...

Código PHP:
    public boolean isRunning(){
        return 
mRun;
    } 
Aqui esta la otra parte de código.

Código PHP:
public class AutoClick extends JFrame implements RunnableEventListener{
    static 
AutoClick AC null;
    static 
Thread Hilo null;
    
Contador C null;
    
Thread HiloC null;
    
int x,ylastTime 3lastTimeContador=0random=0;
    
String s=""j="";
    
    private static final 
long serialVersionUID = -448017304606349615L;
    private 
JPanel contentPane;
    private 
JTextField CoorXFieldCoorYFieldTiempoMinTiempoMax;
    private 
JButton EjecutarPararSalir;
    private 
JLabel CoorXCoorYTiempoHastaClickTiempoClickOpAvanzadasTiempoDeseadoLabelMinLabelMax;

    
/**
     * Launch the application.
     * Guardar las coordenadas x, y en una variable y, cuando llegue el tiempo a 0, comprobar que son iguales para mover
     * o no el ratón
     */
    
public static void main(String[] args) {
        
AC = new AutoClick();
        
Hilo = new Thread(AC);
        
Hilo.start();
    }
         public 
AutoClick() {
        
initComponents();
        
// Propiedades del JFrame
        
this.setAlwaysOnTop(true);
        
this.setVisible(true);
        
this.setLocation(new Point(600280));
        
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
this.setBounds(100100282289);
        
this.setLocationRelativeTo(null);
        
this.setResizable(false);
        
// Iniciamos el timer1 -> Captura las coordenadas del ratón
        
timer1.start();
        
//Instanciamos un objeto de tipo InputMap
        
InputMap map = new InputMap();
        
// Funciones para genera un evento de la tecla enter
        
map.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER0false), "pressed");
        
map.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER0true), "released");
        
// Le asignamos el evento al siguiente botón            
        
Parar.setInputMap(0map);
public 
void Timer3() throws InterruptedException {
        try {
            
timer2.start();
            
quitarAlways(true);
        } 
finally {}
    }
    public 
void quitarAlways(boolean valor){
        
this.setAlwaysOnTop(valor);
    }
    private 
void initComponents() {
        
contentPane = new JPanel();
        
contentPane.setBorder(new EmptyBorder(5555));
        
setContentPane(contentPane);
        
contentPane.setLayout(null);
        
        
// Añadirmos los JLabel del entorno gráfico        
        
CoorX = new JLabel();
        
CoorX.setText("Coordenada X");
        
CoorX.setBounds(20119614);
        
contentPane.add(CoorX);
        
        
CoorY = new JLabel();
        
CoorY.setText("Coordenada Y");
        
CoorY.setBounds(1261110214);
        
contentPane.add(CoorY);
        
        
TiempoHastaClick= new JLabel();
        
TiempoHastaClick.setText("Tiempo hasta el siguiente autoclick:");
        
TiempoHastaClick.setBounds(107421014);
        
contentPane.add(TiempoHastaClick);
        
        
TiempoClick = new JLabel();
        
TiempoClick.setText("0");
        
TiempoClick.setMinimumSize(new Dimension(3012));
        
TiempoClick.setBounds(219747214);
        
contentPane.add(TiempoClick);
        
        
OpAvanzadas = new JLabel();
        
OpAvanzadas.setText("Opciones Avanzadas");
        
OpAvanzadas.setFont(new Font("Tahoma"Font.BOLD12));
        
OpAvanzadas.setBounds(2011112415);
        
contentPane.add(OpAvanzadas);
        
        
TiempoDeseado = new JLabel();
        
TiempoDeseado.setText("Establecer tiempo deseado en minutos");
        
TiempoDeseado.setBounds(2014424414);
        
contentPane.add(TiempoDeseado);
        
        
LabelMin = new JLabel();
        
LabelMin.setText("Tiempo m\u00EDnimo");
        
LabelMin.setBounds(3016710214);
        
contentPane.add(LabelMin);
        
        
LabelMax = new JLabel();
        
LabelMax.setText("Tiempo m\u00E1ximo");
        
LabelMax.setBounds(3019510214);
        
contentPane.add(LabelMax);
        
        
// Añadimos las casillas para introducir texto
        
CoorXField = new JTextField();
        
CoorXField.setEditable(false);
        
CoorXField.setBounds(20439620);
        
contentPane.add(CoorXField);
        
        
CoorYField = new JTextField();
        
CoorYField.setEditable(false);
        
CoorYField.setBounds(1264310220);
        
contentPane.add(CoorYField);
        
        
JSeparator separator = new JSeparator();
        
separator.setBounds(09927610);
        
contentPane.add(separator);
        
        
TiempoMin = new JFormattedTextField();
        
TiempoMin.setBounds(1601643520);
        
contentPane.add(TiempoMin);
        
        
TiempoMax = new JFormattedTextField();
        
TiempoMax.setBounds(1601923520);
        
contentPane.add(TiempoMax);
        
        
// Añadimos los botones de interacción que podrá usar el usuario
        
Ejecutar = new JButton();
        
Ejecutar.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent e) {
                
quitarAlways(false);
                
System.out.println("Running");
                
// Instancio la clase "Contador" como nuevo hilo para controlar su funcionamiento
                 
= new Contador() {
                    private static final 
long serialVersionUID = -1975397236546297348L;
                    public 
void run() {
                        try {
                            
// Mientras "Contador" esté funcionando, esta clase esta a la espera de que termine
                            
while (C.isRunning()){
                                
System.out.println("dentro");
                            }
                            
timer2.start();
                        } catch (
Exception e){
                            
e.printStackTrace();
                        }
                    }
                };
                
HiloC = new Thread(C);
                
HiloC.start();
            }
        });
        
Ejecutar.setText("Ejecutar");
        
Ejecutar.setBounds(102308223);
        
contentPane.add(Ejecutar);
        
        
Parar = new JButton();
        
Parar.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent e) {
                 
timer1.stop();
                 
timer2.stop();
            }
        });
        
Parar.setText("Stop");
        
Parar.setBounds(1022307423);
        
contentPane.add(Parar);
        
        
Salir = new JButton();
        
Salir.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent arg0) {
                
dispose();
                
System.exit(0);
            }
        });
        
Salir.setText("Salir");
        
Salir.setBounds(1892307523);
        
contentPane.add(Salir);
    }
    public 
void run() {
    }


Última edición por yesod91; 09/08/2014 a las 04:54
  #10 (permalink)  
Antiguo 09/08/2014, 05:59
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Hilo isRunning()

Ok, no es C.join() puesto que C es un Runnable. Es Hilo.join(), que es el Thread que contiene al Runnable.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #11 (permalink)  
Antiguo 09/08/2014, 08:56
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Hilo isRunning()

Si pongo esto:

Código PHP:
         // Añadimos los botones de interacción que podrá usar el usuario
        
Ejecutar = new JButton();
        
Ejecutar.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent e) {
                
quitarAlways(false);
                
System.out.println("Running");
                
// Instancio la clase "Contador" como nuevo hilo para controlar su funcionamiento
                 
= new Contador();
                 
HiloC = new Thread(C) {
                    public 
void run() {
                        try {
                            
// Mientras "Contador" esté funcionando, esta clase esta a la espera de que termine
                            /*while (C.isRunning()){
                                System.out.println("dentro");
                            }*/
                            
HiloC.join();
                            
timer2.start();
                        } catch (
Exception e){
                            
e.printStackTrace();
                        }
                    }
                };
                
HiloC.start();
            }
        });
        
Ejecutar.setText("Ejecutar");
        
Ejecutar.setBounds(102308223);
        
contentPane.add(Ejecutar); 
Me hace el mismo efecto que si pongo While (C.isRunning()){} . El contador no hace su función, se queda siempre en 5...

Última edición por yesod91; 09/08/2014 a las 09:27
  #12 (permalink)  
Antiguo 09/08/2014, 09:53
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Hilo isRunning()

Creo que nos estamos liando, en parte porque estás cambiando el código inicial más de la cuenta, en parte porque yo no me estoy fijando bien.

En tu código inicial (primer post) hacias

Código Java:
Ver original
  1. Hilo = new Thread(C);
  2.                 Hilo.start();
  3.                 while (C.isRunning()){
  4.                      
  5.                 }

¿Por qué ahora metes el C.isRunning() o Hilo.join() DENTRO de Contador? Si Contador es un Runnable/Hilo y se queda en espera de sí mismo, nunca va a terminar.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #13 (permalink)  
Antiguo 09/08/2014, 12:08
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Hilo isRunning()

Tengo este código, no se como leches hacer que funcione:

Código PHP:
        // Añadimos los botones de interacción que podrá usar el usuario
        
Ejecutar = new JButton();
        
Ejecutar.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent e) {
                
quitarAlways(false);
                
System.out.println("Running");
                
// Instancio la clase "Contador" como nuevo hilo para controlar su funcionamiento
                
Contador C = new Contador();
                
HiloC = new Thread(C) {
                    public 
void run() {
                        try {
                            
HiloC.start();
                            
// Mientras "Contador" esté funcionando, esta clase esta a la espera de que termine
                            
while (HiloC.isAlive()){
                                
System.out.println("vivo");
                            }
                            
timer2.start();
                        } catch (
Exception e){
                            
e.printStackTrace();
                        }
                    }
                };
            }
        });
        
Ejecutar.setText("Ejecutar");
        
Ejecutar.setBounds(102308223);
        
contentPane.add(Ejecutar); 
Me estoy liando, lo CREO que sería lo suyo es: Instancio Contador, meto Contador como HiloC y, luego le digo al propio hilo lo que tiene que hacer, no se si es un razonamiento válido...

Última edición por yesod91; 09/08/2014 a las 12:24
  #14 (permalink)  
Antiguo 09/08/2014, 12:25
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Hilo isRunning()

Ya has vuelto a cambiar el código. Normal que no funcione tal cual lo tiene ahora.

Declaras HiloC y le pones un método run(). Si llamas a start() dentro del run(), eso nunca se ejecutará, ya que al run() lo llama el hilo cuando tú llamas a start() y al start() lo llamas dentro del run(), así que el uno por el otro, ninguno se llama nunca. ¿Por qué has metido el start() dentro?

Y lo que te dije antes. Si el hilo dentro de su metodo run() se pone a esperar por si mismo sin hacer nada mas, nunca terminara.

Creo que debes pararte a pensar lo que estás haciendo, da la impresión de que estás moviendo código de un sitio a otro sin pensar.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #15 (permalink)  
Antiguo 09/08/2014, 13:44
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Hilo isRunning()

El problema es que estoy quemado y HARTO de no dar con la solución...de pensar una forma y que no funcione...

Lo he dejado como lo tenía desde un principio para que el contador por lo menos funcione.

Código PHP:
        // Añadimos los botones de interacción que podrá usar el usuario
        
Ejecutar = new JButton();
        
Ejecutar.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent e) {
                
quitarAlways(false);
                
// Instancio la clase "Contador" como nuevo hilo para controlar su funcionamiento
                 
= new Contador() {
                    private static final 
long serialVersionUID = -1975397236546297348L;
                    
/*public void run() {
                        try {
                            // Mientras "Contador" esté funcionando, esta clase esta a la espera de que termine
                            while (C.isRunning()){
                                System.out.println("dentro");
                            }
                            timer2.start();
                        } catch (Exception e){
                            e.printStackTrace();
                        }
                    }*/
                
};
                
HiloC = new Thread(C);
                
HiloC.start();
            }
        });
        
Ejecutar.setText("Ejecutar");
        
Ejecutar.setBounds(102308223);
        
contentPane.add(Ejecutar); 
Ahora, no se como hacer el resto...

Última edición por yesod91; 09/08/2014 a las 14:37
  #16 (permalink)  
Antiguo 10/08/2014, 04:22
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Hilo isRunning()

Hola:

Te pego lo que creo que quieres hacer. La primera clase (PruebaContador) es la ventana principal con el boton que lanza el contador y tiene el código que quieres que espere. La segunda clase es el dialogo contador (le he puesto JDialog porque es más correcto que JFrame para ventanas secundarias). Lo he comentado y creo que se entiende, ya me diras si va.

Código Java:
Ver original
  1. package com.chuidiang.ejemplos.swing;
  2.  
  3. import java.awt.FlowLayout;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6.  
  7. import javax.swing.JButton;
  8. import javax.swing.JFrame;
  9.  
  10. public class PruebaContador extends JFrame implements ActionListener {
  11.  
  12.    private static final long serialVersionUID = -3776504819992272375L;
  13.  
  14.    public static void main(String[] args) {
  15.       new PruebaContador();
  16.    }
  17.  
  18.    public PruebaContador() {
  19.       setLayout(new FlowLayout());
  20.       JButton boton = new JButton("Pulsame");
  21.       boton.addActionListener(this);
  22.       getContentPane().add(boton);
  23.       pack();
  24.       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  25.       setLocationRelativeTo(null);
  26.       setVisible(true);
  27.    }
  28.    
  29.    public void actionPerformed(ActionEvent arg0) {
  30.      
  31.       // Se lanza todo en un hilo para evitar bloquear el hilo de
  32.       // despacho de eventos de java (EDT). Si no se hace así, no
  33.       // se verá progresar el dialogo contador y se quedara bloqueada
  34.       // toda la interfaz de usuario hasta que termine el contador.
  35.       Thread hiloQueEvitaBloquearEDT = new Thread() {
  36.          public void run() {
  37.  
  38.             DialogoContador dialogoContador = new DialogoContador(
  39.                   PruebaContador.this);
  40.            
  41.             Thread hilo = new Thread(dialogoContador);
  42.             hilo.start();
  43.            
  44.             // Espera a que termine el hilo contador
  45.             try {
  46.                hilo.join();
  47.             } catch (InterruptedException e) {
  48.                e.printStackTrace();
  49.             }
  50.            
  51.             // Codigo que no se ejecuta hasta que se termine el contador
  52.             System.out.println("Sigue la ejecucion");
  53.          }
  54.  
  55.       };
  56.       hiloQueEvitaBloquearEDT.start();
  57.    };
  58.  
  59. }

Y el dialogo contador

Código Java:
Ver original
  1. package com.chuidiang.ejemplos.swing;
  2.  
  3. import java.awt.Frame;
  4.  
  5. import javax.swing.JDialog;
  6. import javax.swing.JLabel;
  7.  
  8. public class DialogoContador extends JDialog implements Runnable {
  9.    private static final long serialVersionUID = 4898321869557863294L;
  10.    private JLabel label = new JLabel();
  11.    private int contador = 20;
  12.  
  13.    public DialogoContador(Frame parent) {
  14.       // Pasando el frame principal como parent, se evita que el dialogo
  15.       // contador se vaya detras de la ventana principal.
  16.       super(parent);
  17.       label.setText(Integer.toString(contador));
  18.       add(label);
  19.       pack();
  20.    }
  21.  
  22.    public void run() {
  23.       setVisible(true);
  24.  
  25.       // Bucle contador
  26.       while (contador > 0) {
  27.          try {
  28.             Thread.sleep(500);
  29.             contador--;
  30.             label.setText(Integer.toString(contador));
  31.          } catch (InterruptedException e) {
  32.             e.printStackTrace();
  33.          }
  34.  
  35.       }
  36.  
  37.       setVisible(false);
  38.    }
  39. }

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #17 (permalink)  
Antiguo 10/08/2014, 08:37
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 83
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: Hilo isRunning()

Si, perfecto!! Funciona perfectamente! Me voy a estudiar el código y, a compararlo con el que yo tenía para ver las diferencias y que no me vuelva a pasar esto :D

Muchas gracias :)

Etiquetas: hilo, jframe
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 06:22.