Programacion Multihilos
Programacion Multihilos
Edgar Garca
Qu es un hilo?
Un hilo es bsicamente una tarea que puede ser ejecutada en paralelo con otra tarea. Un hilo de ejecucin o subproceso es una caracterstica que permite a una aplicacin realizar varias tareas a la vez (concurrentemente). Los distintos hilos de ejecucin comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situacin de autenticacin, etc. Esta tcnica permite simplificar el diseo de una aplicacin que debe llevar a cabo distintas funciones simultneamente.
Creacin de un Thread
Implementando Runnable Extendiendo de Thread
Heredando Thread
Solamente tenemos que sobreescribir el metodo run() de la clase Thread para escribir el cdigo que se estar ejecutando cuando se inicie el thread. Esta opcin imposibilita que la clase pueda heredar comportamientos de otra clase a menos que se cree una clase hija y extienda de esta, siempre y cuando la clase no este marcada como final.
Implementando Runnable
Con esta manera tenemos un diseo mas abierto a ser extendido ya que la clase a la que le implementemos Runnable puede heredar caracteristicas de otras. Al implementar Runnable estaremos obligados a implementar el mtodo abstracto run().
Arranque de un Thread
Todos los Threads corren bajo un thread principal, que al final de todos es el Thread donde esta ejecutandose el metodo main. Ejemplo: t1 = new TestTh( "Thread 1",(int)(Math.random()*2000) ); t1.start(); start(), en realidad es un mtodo oculto en el thread que llama al mtodo run().
Manipulacin de un Thread
Poner un thread a dormir: sleep(); Suspender: Es poner un hilo en espera indefinidamente t1.suspend(); Resumir: Es rehabilitar un hilo que anteriormente estaba en espera. t1.resume(); Stop: Terminar la ejecucin de un thread, pero no lo elimina el objeto de la memoria, se puede iniciar con start otra vez. t1.stop();
Estados de un Thread
Nuevo Thread
La siguiente sentencia crea un nuevo thread pero no lo arranca, lo deja en el estado de "Nuevo Thread Cuando un thread est en este estado, es simplemente un objeto Thread vaco. El sistema no ha destinado ningn recurso para l. Desde este estado solamente puede arrancarse llamando al mtodo start(), o detenerse definitivamente, llamando al mtodo stop(); la llamada a cualquier otro mtodo carece de sentido y lo nico que provocar ser la generacin de una excepcin de tipo IllegalThreadStateException.
Ejecutable
La llamada al mtodo start() crear los recursos del sistema necesarios para que el thread puede ejecutarse, lo incorpora a la lista de procesos disponibles para ejecucin del sistema y llama al mtodo run()del thread Este estado es Ejecutable y no En Ejecucin, porque cuando el thread est aqu no esta corriendo. Una vez el JVM le de su tiempo para ejecutarse el pasa a Ejecucin.
Parado
Se encuentra en este estado cuando se dan las siguientes condiciones:
suspend(); delete(); wait(); sleep();
Muerto
Un Thread puede morir de dos formas:
Llamar el metodo stop(); Termina de ejecutar su metodo run();
Scheduling
El planificador (o scheduler en ingls) es un componente funcional muy importante de los sistemas operativos multitarea y multiproceso, y es esencial en los sistemas operativos de tiempo real. Su funcin consiste en repartir el tiempo disponible de un microprocesador entre todos los procesos que estn disponibles para su ejecucin
Scheduler
Hay dos caractersticas de los threads que el scheduler identifica en este proceso de decisin:
Prioridad del thread Indicador de Demonio
Thread Daemon
Son hilos de muy baja prioridad (llamados servicios) que normalmente se ejecutan en periodos muy largos usando pocos recurso. Para crear un demonio se usa setDaemon():true o false Ejemplos:
Garbage Collector
Tipos de Scheduler
Pre-emptivo: Asigna un tiempo a cada Thread No pre-empivo: Ejecuta un thread a la vez y hasta que no termina no ejecuta otro.
Pre-emptivo
El Scheduler decide cual thread va a ser ejecutado y llama su metodo resume() y el metodo suspend() a los dems threads que estan en el Scheduler. El mtodo yield() es la forma en que un thread fuerza al scheduler a comenzar la ejecucin de otro thread que est esperando
Uso synchronized
La palabra reservada synchronized se usa para indicar que ciertas partes del cdigo, (habitualmente, una funcin miembro) estn sincronizadas, es decir, que solamente un subproceso puede acceder a dicho mtodo a la vez. Se puede sincronizar un mtodo o un bloque de codigo.
Vamos entonces a crear un productor, que ser un thread que ir sacando caracteres por su salida; crearemos tambin un consumidor que ira recogiendo los caracteres que vaya sacando el productor y un monitor que controlar el proceso de sincronizacin entre los threads. Funcionar como una tubera, insertando el productor caracteres en un extremos y leyndolos el consumidor en el otro, con el monitor siendo la propia tubera.