viernes, 19 de octubre de 2012

Ejemplo de señalización ( wait() y notify() )

En este ejemplo vamos a tener 3 clases: una clase Main, una clase Saludo y una clase Personal (Hilo).

Clase Main:

public class Main {
   
    public static void main(String[] args) {
       
        // Objeto en comun, se encarga del wait y notify
        Saludo s = new Saludo();
       
        /*Instancio los hilos y le paso como parametros:
         *

Ejemplo exclusión mutua (synchronized)

En este ejemplo vamos a tener 3 clases: una clase Main, una clase CuentaBanco y una clase VerificarCuenta (Hilo).

Clase Main:

public class Main {
    public static void main(String[] args) {
       
        VerificarCuenta vc = new VerificarCuenta();
       
        Thread Luis = new Thread(vc, "Luis");
        Thread Manuel = new Thread(vc, "Manuel");
       
        Luis.start();
        Manuel.start();
    }
}

Sincronización (Threads)


La importancia de la sincronización
La programación concurrente puede dar lugar a muchos errores debido a la utilización de recursos compartidos que pueden ser alterados. Las secciones de código potencialmente peligrosas de provocar estos errores se conocen como secciones críticas.

En general los programas concurrentes deben ser correctos totalmente. Este concepto es la suma de dos conceptos distintos de la corrección parcial(o safety) esto es que terminara en algún momento de tiempo finito. En esto programas por lo tanto hay que evitar que varios hilos entren en una sección critica (exclusión mutua o mutex) y que los programas se bloqueen (deadlock).

Planificación de Threads (Prioridades)


Que significa planificación
Un tema fundamental dentro de la programación multihilo es la planificación de los hilos. Este concepto se refiere a la política a seguir de que hilo toma el control del procesador y cuando. Obviamente en el caso de que un hilo este bloqueado esperando una operación de I/O este hilo debería dejar el control del procesador y que este control lo tomara otro hilo que si pudiera hacer uso del tiempo de CPU. ¿Pero que pasa si hay más de un hilo esperando? ¿A cual de ellos le otorgamos el control del procesador?

Prioridades
Para determinar que hilo debe ejecutarse primero, cada hilo posee su propia prioridad: un hilo de prioridad mas alta que se encuentre en el estado LISTO entrara antes en el estado EN EJECUCION que otro de menor prioridad.

El método setPriority()
Para establecer la prioridad de un thread se utiliza el método setPriority() de la siguiente manera:

Estados de un Thread


Estado Nuevo
El Thread ha sido creado pero no inicializado, es decir, no se ha ejecutado todavía el método start(). Se producirá un mensaje de error (IllegalThreadStateException) si se intenta ejecutar cualquier método de la clase Thread distinto de start().

Estado Ejecutable
El Thread puede estar ejecutándose, siempre y cuando se le haya asignado un determinado tiempo de CPU. En la practica puede no estar siendo ejecutado en un instante determinado en beneficio de otro thread.

Estado Bloqueado
El Thread podría estar ejecutándose, pero hay alguna actividad interna suya que lo impide, como por ejemplo una espera producida por una operación de escritura o lectura de datos por teclado (E/S). Si un Thread esta en este estado, no se le asigna tiempo de CPU.