15 de marzo de 2015

Java Thread


Thread: Crear aplicaciones cocurrentes.

La implementacion de hilos en Java se puede hacer de dos formas:
  • Heredando de la clase Thread
  • Implementando la interface Runnable
 La forma recomendad para hacerlo es implementando la interface Runnable. Pero esto genera dos dudas:
  • Como iniciarlo.
  • Como detenerlo.
 El inicio es sencillo:

        Thread myThread = new Thread(new MyThread());
        myThread.start();
       

 Como detenerlo es lo complicado, pero no lo es, la clase Thread proporciona un metodo stop(), pero este ya no se debe usar, es inseguro y puede que no detenga el hilo de forma apropiada.

Una forma recomendada es usar el metodo interrupt(), pero hay que implementarlo bien, para que el hilo se pueda detener. Se deben tener en cuenta lo siguiente:
  • Tener una variable (flag) para saber cuando se debe detener el hilo.
  • Controlar las excepciones tipo InterruptedException
  • Estar preguntando si el hilo donde se esta ejecutando fue interunpido.

Ejemplo:

 public class MyThread implements Runnable {

    private volatile boolean stop = true;

    @Override
    public void run() {
        stop = false;
        while (!stop) {
          
            try{
                Thread.sleep(1000);
            }catch(InterruptedException interruptedException){
                stop = true;
            }

            if (Thread.currentThread().isInterrupted()) {
                stop = true;
            }
        }//End While

    }//End run

}//End class

Tenemos la varible "stop" de tipo boolean y "volatil", con la cual vamos a detener el while y parar el hilo.

Si tenemos un Thread.sleep, se debe controlar la excepcion arrojada, porque si el hilo fue interrumpido la excepcion es arroja, y esto quiere decir que el hilo lo estan intentado detener.

Se esta preguntando con el llamado "Thread.currentThread().isInterrupted()", para saber si fue interrumpido, si este fue interrumpido, se debe controlar la terminacion del hilo. Tener en cuenta que es posible usar "Thread.interrupted()" para saber si fue interrumpido,  pero cambia el valor de la bandera (flag) interna del la clase Thread y puede afectar posteriores llamados, Thread.currentThread().isInterrupted() solo obtiene el valor mas no lo cambia.

Y para terminar el hilo solo se debe llamar:

myThread.interrupt();

Hilo Terminado.


Referencias:

8 de febrero de 2015

Ctrl+C (SIGINT) in Java


Capturando el evento de apagado (shuts down) de la maquina virtual de Java.

Esto sucede cuando:

* Un programa finaliza normalmente  o  System.exit
* O cuando se presiona Ctrl + C  (^C), equivalente a la señal SIGINT

Java proporciona una forma de obtener este evento:

De la clase Runtime el método:


public void addShutdownHook(Thread hook)

Proporciona una forma de ejecutar una porción de código antes que termine el programa.

Recibe como parámetro un Thread instanciado sin iniciar.

Una forma sencilla de hacerlo es:


Runtime.getRuntime().addShutdownHook(new Thread() {
      public void run() {
              /* 
my shutdown code here */.
    }
});


Nota: Solo se puede obtener una vez, así que antes de terminar el aplicativo se debió escribir esa linea de código.

Referencias:

4 de enero de 2015

Mozilla Firefox para Raspberry Pi



Mozilla Firefox no esta disponible para Raspberry Pi, para su SO basado en Debian, debido a un problema de política de uso de la marca "Firefox" y sus logos (Mozilla Corporation software rebranded by the Debian project), por tal motivo, los encargados del proyecto  Debian renombro a Firefox (Zorro de Fuego o Panda  Rojo) por Iceweasel (Comadreja de Hielo), el nombre no debe confundirse con el proyecto de GNU IceWeasel (con la W mayuscula), el cual fu renombredo a IceCat para no confundir los proyectos.

Así que para instalar ejecutamos el comando:

sudo apt-get install iceweasel



Solo cambia el nombre, los plugins complementos y demas, funcionan.



Fuente:

Mozilla Corporation software rebranded by the Debian project
Iceweasel
GNU IceCat