Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > HILOS (THREADS)

Hola a todos,
He probado con ejemplos de la web "factorizar" mi codigo y he probado pero no logro entender como acomodar el codigo para crear y ejecutar un hilo.

mi clase como veran carga y ejecuta todo en el constructor de la misma (en EDT) lo cual lo hace lento.
a modo de ejemplo como tendria que acomodar el siguiente codigo para que sea ejecutado en un hilo ??

package Interfaz;

import Dominio.Nivel1;
import Dominio.VinculaNivel;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class VentanaCiiu extends javax.swing.JFrame {

private Dominio.Fachada miSistema;
private ArrayList<Nivel1> listaNivel1;
private ArrayList<VinculaNivel> listaVinculaNivel;
// private ArrayList<Nivel2> listaNivel2;
// private ArrayList<Nivel3> listaNivel3;
// private ArrayList<Nivel4> listaNivel4;

/**
* Creates new form VentanaCiiu
*/
public VentanaCiiu() {

miSistema = Dominio.Fachada.getInstanciaFachada();

initComponents();
//NO PERMITO QUE PUEDAN CAMBIAR EL TAMAÑO DE LA VENTANA
this.setResizable(false);
//AHORA LA CENTRO EN LA PANTALLA
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width) / 2), (pantalla.height - cuadro.height) / 2);

jComboNivel1.addItem("Elegir Nivel1");
setListaNivel1(miSistema.listarNivel1());
for (int i = 0; i < listaNivel1.size(); i++) {
jComboNivel1.addItem(listaNivel1.get(i).getDescripcionNivel1());
}


// Accion a realizar cuando el JComboBox cambia de item seleccionado.
jComboNivel1.addActionListener(new ActionListener() {
//@Override
public void actionPerformed(ActionEvent e) {
if (jComboNivel1.getSelectedIndex() == 0) {

jTextAreaDescripcion.setText("");
jComboNivel2.removeAllItems();
jComboNivel2.removeAllItems();
jComboNivel3.removeAllItems();
jComboNivel4.removeAllItems();

} else {


int posicion = jComboNivel1.getSelectedIndex();
setListaVinculaNivel(miSistema.listarVinculaNivelXNivel1(posicion));
int idNivel2Anterior;
idNivel2Anterior = 0;

jComboNivel2.addItem("Elegir Nivel2");

for (int i = 0; i < listaVinculaNivel.size(); i++) {

if (idNivel2Anterior != listaVinculaNivel.get(i).getIdNivel2()) {

idNivel2Anterior = listaVinculaNivel.get(i).getIdNivel2();
jComboNivel2.addItem(miSistema.buscarNivel2XId(idNivel2Anterior).getDescripcionNivel2());
}

}

//
//
//
//
//
//

}
}
});

}

/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jComboNivel1 = new javax.swing.JComboBox();
jComboNivel2 = new javax.swing.JComboBox();
jComboNivel3 = new javax.swing.JComboBox();
jComboNivel4 = new javax.swing.JComboBox();
jLabelNivel1 = new javax.swing.JLabel();
jLabelNivel2 = new javax.swing.JLabel();
jLabelNivel3 = new javax.swing.JLabel();
jLabelNivel4 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
jTextAreaDescripcion = new javax.swing.JTextArea();
jLabelDescripcionCiiu = new javax.swing.JLabel();
jButtonSalir = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

jLabelNivel1.setText("Nivel1");

jLabelNivel2.setText("Nivel2");

jLabelNivel3.setText("Nivel3");

jLabelNivel4.setText("Nivel4");

jTextAreaDescripcion.setColumns(20);
jTextAreaDescripcion.setRows(5);
jScrollPane1.setViewportView(jTextAreaDescripcion);

jLabelDescripcionCiiu.setText("Descripcion :");

jButtonSalir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Icono/SALIR.JPG"))); // NOI18N
jButtonSalir.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButtonSalirActionPerformed(evt);
}
});

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(97, 97, 97)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabelNivel4)
.addComponent(jLabelNivel1)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jComboNivel1, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jComboNivel2, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jComboNivel3, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jComboNivel4, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jLabelNivel2)
.addComponent(jLabelNivel3))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(jButtonSalir))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 552, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabelDescripcionCiiu))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(29, 29, 29)
.addComponent(jLabelNivel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jComboNivel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(16, 16, 16)
.addComponent(jLabelNivel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jComboNivel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jLabelNivel3)
.addGap(3, 3, 3)
.addComponent(jComboNivel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(14, 14, 14)
.addComponent(jLabelNivel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jComboNivel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jLabelDescripcionCiiu)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 322, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 21, Short.MAX_VALUE)
.addComponent(jButtonSalir)
.addContainerGap())
);

pack();
}// </editor-fold>

private void jButtonSalirActionPerformed(java.awt.event.ActionEvent evt) {
this.dispose();
}

public void setListaNivel1(ArrayList<Nivel1> listaNivel1) {
this.listaNivel1 = listaNivel1;
}

public void setListaVinculaNivel(ArrayList<VinculaNivel> listaVinculaNivel) {
this.listaVinculaNivel = listaVinculaNivel;
}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;


}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(VentanaCiiu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(VentanaCiiu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(VentanaCiiu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(VentanaCiiu.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>

/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new VentanaCiiu().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonSalir;
private javax.swing.JComboBox jComboNivel1;
private javax.swing.JComboBox jComboNivel2;
private javax.swing.JComboBox jComboNivel3;
private javax.swing.JComboBox jComboNivel4;
private javax.swing.JLabel jLabelDescripcionCiiu;
private javax.swing.JLabel jLabelNivel1;
private javax.swing.JLabel jLabelNivel2;
private javax.swing.JLabel jLabelNivel3;
private javax.swing.JLabel jLabelNivel4;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextAreaDescripcion;
// End of variables declaration
}

octubre 23, 2012 | Registered Commenterdmorales

No veo ningún problema relativo al EDT, ni ninguna razón para que sea lento... excepto en esos métodos externos que proceden de Nivel1 y VinculaNivel.
¿Qué tipo de código contienen?.

octubre 23, 2012 | Registered Commenterchoces

traen objetos con sus distintos atributos, si no tiene problema el EDT con eso. Indudablemente no fui claro en lo que busco con mi pregunta. Simplemente que estoy tratando de hacer lo mismo pero tratando de utilizar un hilo porque cuando siga desarrollando codigo para esa clase va a tener metodos mas "pesados" y si lo sigo agregando ahi si se va a notar como "quietud" en la interfaz de usuario. Por lo tanto quiero aprender y saber como hacerlo a travez de un hilo y quitar la ejecucion de los procesos del EDT.
He probado pero realmente no se como manejar los distintos metodos y sus llamadas por ej. (run()) donde pondria los procesos "pesados"

octubre 23, 2012 | Registered Commenterdmorales

como vi de utilizar la clase Thread (pero no puedo utilizar implements Thread porque esta clase ya hereda de Jframe) deberia crear una nueva solamente para poder sobreescribir el metodo run() y llamar al hilo desde esta otra ?? no lo veo practico si en todo mi proyecto en mis otras clases tuviera que hacer lo mismo........debería de haber alguna solucion mas eficiente creo...

octubre 23, 2012 | Registered Commenterdmorales

Swing usa un único hilo, el EDT, y todos los objetos de Swing y los métodos que escriben en la pantalla, necesariamente deben ejecutarse en el EDT.
Lo único que se puede hacer, para evitar sobrecargar el EDT (y "congelar" el UI), es ejecutar el código que no escribe en el UI, en hilos separados. Siempre que sea especialmente lento, como acceder a bases de datos, a recursos de red, cargar imágenes grandes, etc.

Se puede usar Runnable, Callable<T>, Future<T> y SwingWorker<K,V>, con la particularidad en los tres primeros de que cuando sea necesario escribir en el UI, se debe usar

EvenQueue.invokeLater(new Runnable(){

public void run(){
// aquí irá el código para el EDT
}
});

En el caso de SwingWorker, el código para el EDT se ejecuta en su método done()

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

octubre 24, 2012 | Registered Commenterchoces

Sigo investigado todavia porque no he logrado hasta el momento llegar a una solucion.

octubre 24, 2012 | Unregistered Commenterdmorales

Ya lo he solucionado y entendido como siempre son muy valiosos tus aportes !!! nuevamente gracias.

octubre 25, 2012 | Registered Commenterdmorales