jueves, 26 de abril de 2012

Hilos en Java


Si se va a manejar una clase heredada con comportamiento de thread, Runnable es la solucion correcta. El presente ejemplo presenta esto haciendo una clase Runnable Canvas que pinta diferentes colores en el lienzo. Esta aplicación permite el ingreso desde la linea de comandos del numero de colores a presentar y el tamaño de la pausa en milisegundos para cambiar los colores en el lienzo.
ColorBoxes es una aplicación típica con un constructor que activa el GUI. Éste toma un argumento de int grid para activar el GridLayout. Luego agrega el numero apropiado de objetos Cbox para llenar la rejilla, pasando el valor de la pausa a cada uno. En main() se pueden ver los valores por default de pause y grid, los cuales pueden cambiarse por aquellos pasados desde la linea de comandos.
Cbox es donde se hace todo el trabajo. Este es heredado de Canvas e implementa la interface Runnable de tal manera que que cada Canvas se comporte como un Thread. Recuerda que cuando implementas Runnable, no estas creando un objeto Thread, solo una clase que tiene un método run(). Asi, deberás crear explicitamente un objeto Thread y manejar el objeto Runnable desde el constructor, luego llamar start(). En Cbox este thread se llama t.
Note que el arreglo colors es una enumeracion de todos los colores en la clase Color. Este es usado en newColor() para producir aleatoriamente un color. El color de la celda actual es cColor. paint() es muy simple – solo pone el color en cColor y llena el lienzo entero con ese color.
En run(), se ve el ciclo infinito que pone el color cColor a un nuevo color aleatorio y luego llama a repaint() para mostrarlo. Luego el thread va a sleep() el tiempo especificado en main().
Precisamente porque este diseño es flexible y el threading esta ligado a cada elemento Canvas, puedes experimentar haciendo tantos thread como quieras. (En realidad, hay una restricción impuesta por el número de thread que tu JVM puede manejar confortablemente).
//: ColorBoxes.java
// Using the Runnable interface
import java.awt.*;
import java.awt.event.*;

class CBox extends Canvas implements Runnable {
      private Thread t;
      private int pause;
      private static final Color[] colors = {
            Color.black, Color.blue, Color.cyan,
            Color.darkGray, Color.gray, Color.green,
            Color.lightGray, Color.magenta,
            Color.orange, Color.pink, Color.red,
            Color.white, Color.yellow
      };
     
      private Color cColor = newColor();
      private static final Color newColor() {
            return colors[
            (int)(Math.random() * colors.length)
            ];
      }
     
      public void paint(Graphics g) {
            g.setColor(cColor);
            Dimension s = getSize();
            g.fillRect(0, 0, s.width, s.height);
      }
     



      public CBox(int pause) {
            this.pause = pause;
            t = new Thread(this);
            t.start();
      }
     
      public void run() {
            while(true) {
                  cColor = newColor();
                  repaint();
                  try {
                        t.sleep(pause);
                  } catch(InterruptedException e) {}
            }
      }
}

public class ColorBoxes extends Frame {
      public ColorBoxes(int pause, int grid) {
            setTitle("ColorBoxes");
            setLayout(new GridLayout(grid, grid));
            for (int i = 0; i < grid * grid; i++)
                  add(new CBox(pause));
            addWindowListener(new WindowAdapter() {
                  public void windowClosing(WindowEvent e) {
                        System.exit(0);
                  }
            });
      }
     
      public static void main(String[] args) {
            int pause = 50;
            int grid = 8;
            if(args.length > 0)
                  pause = Integer.parseInt(args[0]);
            if(args.length > 1)
                  grid = Integer.parseInt(args[1]);
            Frame f = new ColorBoxes(pause, grid);
            f.setSize(500, 400);
            f.setVisible(true);
      }
} ///:~
Una vez compilado, el programa se puede correr con argumentos o sin ellos.
java ColorBoxes ¿         Que es equivalente a java ColorBoxes 50 8
java ColorBoxes 25 16 ¿            La pausa es de 25 mseg y la rejilla tendra 16 celdas.





No hay comentarios:

Publicar un comentario