Programación General > Java
Hilos
Ric_Monje:
Bueno aqui va mi segundo programa trabajando con Hilos, son algo basicos, pero poco apoco espero ir aprendiendo.
CLASE Data
--- Código: Text --- public class Data { private int x; public Data() { this.x = x; } public int getx() { return x; } public void setx(int x) { this.x = x; } }
CLASE MiHil
--- Código: Text --- public class MiHil extends Thread{ private Data d; public MiHil(Data m){ d=m; } public void run(){ synchronized(d){ int z; z=d.getx(); z=z+1; d.setx(z); } System.out.println(d.getx()); } public static void main(String agr[]){ Data p=new Data(); p.setx(1); MiHil a = new MiHil (p); MiHil b = new MiHil (p); a.start(); b.start(); } }
Con timepo, montare los que valla haciendo
frealgagu:
Bien, esta fue una clase de Hilos que dicté en las asesorías que presto en la Universidad, lo diseñé de tal forma que se mostrara gráficamente (en un applet), aquí les explico el Ejemplo:
--- Código: Text --- import java.applet.*;import java.awt.*; public class Hilos extends Applet{ Hilo hilo1; Hilo hilo2; Hilo hilo3; Hilo hilo4; Hilo hilo5; Hilo hilo6; public void init() { hilo1=new Hilo(); hilo2=new Hilo(); hilo3=new Hilo(); hilo4=new Hilo(); hilo5=new Hilo(); hilo6=new Hilo(); hilo1.start(); hilo2.start(); hilo3.start(); hilo4.start(); hilo5.start(); hilo6.start(); new Repintar(this).start(); } public void update(Graphics c) { //Doble Buffer Image dibujo=createImage(800,600); Graphics g=dibujo.getGraphics(); g.setColor(Color.blue); g.fillRect(hilo1.getX(),hilo1.getY(),50,50); g.setColor(Color.red); g.fillRect(hilo2.getX(),hilo2.getY(),50,50); g.setColor(Color.green); g.fillRect(hilo3.getX(),hilo3.getY(),50,50); g.setColor(Color.gray); g.fillRect(hilo4.getX(),hilo4.getY(),50,50); g.setColor(Color.cyan); g.fillRect(hilo5.getX(),hilo5.getY(),50,50); g.setColor(Color.magenta); g.fillRect(hilo6.getX(),hilo6.getY(),50,50); //Doble Buffer c.drawImage(dibujo,0,0,null); } }class Hilo extends Thread{ int x,y; Hilo() { x=320; y=240; } public int getX() { return x; } public int getY() { return y; } public void run() { while(true) { int direccion=(int)(Math.random()*4); if(direccion==0) x+=10; else if(direccion==1) x-=10; else if(direccion==2) y-=10; else y+=10; try { sleep(100); }catch(Exception e) { System.out.println(""+e); } } }}class Repintar extends Thread{ Hilos principal; Repintar(Hilos principal) { this.principal=principal; } public void run() { while(true) principal.repaint(); }} En realidad este programa nos muestra en un applet seis diferentes cuadrados de distinto color, que se van moviendo constantemente por la pantalla de manera aleatoria, par aconseguir esto, utilizo la clase Hilo que hereda de Thread e implemento el método run(), el cual contiene un ciclo infinito que me ira cambiando las coordenadas x e y de los diferentes cuadrados.
Dicionalmente utilizo una clase Repintar que hereda también de Thread, por medio del cual puedo repintar constantemente todos los cuadrados.
Espero sea de ayuda. Este ejemplo lo coloqué más para demostrar de una manera menos tediosa el funcionamiento de los hilos.
Ric_Monje:
frealgagu gracias por el ejemplo, de verdad me a sevido de mucha ayuda para mi apredisaje, ahora trabaje en una ventana que muestra 4 imagenes que van cambiando cada x timepo, y si se da clcik sobre la imagen para de cambiar...veanlo y opinen :kicking:
--- Código: Text --- import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.util.Vector; import javax.swing.*; public class Ventana extends JFrame implements Runnable { private boolean g= false; private JLabel j= new JLabel(); private Vector <ImageIcon> imagenes= new Vector<ImageIcon>(); private int i=0; public Ventana(){ this.setTitle("Buuuuuuu"); this.setBounds(200, 150, 200, 200); j.setBounds(200, 150, 200, 200); this.add(j); j.addMouseListener(new MouseListener(){ public void mouseClicked(MouseEvent e) { int x=e.getX(); int y=e.getY(); if(x<=350){ g=true; } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } }); } public static void main(String arg[]){ Ventana a= new Ventana (); a.setVisible(true); Thread t = new Thread( a ); t.start(); } public void run(){ ImageIcon e= new ImageIcon(); ImageIcon d= new ImageIcon ("java_starting.jpg"); ImageIcon b= new ImageIcon ("t_java_logo.jpg"); ImageIcon c= new ImageIcon ("ComfyChairRadSmall-full.jpg"); ImageIcon a= new ImageIcon ("javatrap.jpg"); imagenes.add(a); imagenes.add(b); imagenes.add(c); imagenes.add(d); for(int f=0; f<=100 && g==false;f++){ if(i==4){ i=0; } try { Thread.sleep(600); } catch (InterruptedException e1) { e1.printStackTrace(); } j.setIcon(imagenes.get(i)); i+=1; } } }
En el metodo run, solo es que cambien las imagenes jpg por una que uds quieran :whistling:
frealgagu:
Buen apunte, en realidad el trabajo con hilos facilita mucho la vida, cuando se quieren hacer tareas independientes al hilo de ejecución normal del programa, por ejemplo en la reproducción de sonidos internamente trabaja los hilos para que se reproduzca el sonido sin que se pause el funcionamiento normal del programa. Tambien puede funcionar cuando se utiliza algún procedimiento que utilice mucho tiempo.
Ric_Monje:
Poco a poco se va rpendiendo
--- Código: Text --- // Varios subprocesos imprimiendo en distintos intervalos. public class ProbadorSubprocesos { public static void main( String [] args ) { // crear y nombrar a cada subproceso ImprimirSubproceso subproceso1 = new ImprimirSubproceso( "subproceso1" ); ImprimirSubproceso subproceso2 = new ImprimirSubproceso( "subproceso2" ); ImprimirSubproceso subproceso3 = new ImprimirSubproceso( "subproceso3" ); System.err.println( "Iniciando subprocesos" ); subproceso1.start(); // iniciar subproceso1 y colocarlo en estado listo subproceso2.start(); // iniciar subproceso2 y colocarlo en estado listo subproceso3.start(); // iniciar subproceso3 y colocarlo en estado listo System.err.println( "Subprocesos iniciados, termina main\n" ); } // fin de main } // fin de la clase ProbadorSubprocesos // la clase ImprimirSubproceso controla la ejecución de los subprocesosclass ImprimirSubproceso extends Thread { private int tiempoInactividad; // asignar nombre a subproceso, llamando al constructor de la superclase public ImprimirSubproceso( String nombre ) { super( nombre ); // elegir tiempo de inactividad aleatorio entre 0 y 5 segundos tiempoInactividad = ( int ) ( Math.random() * 5001 ); } // el método run es el código a ejecutar por el nuevo subproceso public void run() { // colocar subproceso en inactividad durante el tiempo indicado por tiempoInactividad try { System.err.println( getName() + " va a estar inactivo durante " + tiempoInactividad ); Thread.sleep( tiempoInactividad ); } // si el subproceso se interrumpió durante su inactividad, imprimir rastreo de la pila catch ( InterruptedException excepcion ) { excepcion.printStackTrace(); } // imprimir nombre del subproceso System.err.println( getName() + " termino su inactividad" ); } // fin del método run } // fin de la clase ImprimirSubproceso
Navegación
[*] Página Anterior
Ir a la versión completa