Una thread es un único flujo de contrrol dentro de un programa.
Algunnaas veces es llammado contexto de ejecución porque cada thread
debe tenner sus propios recurssos, como el prrogram counter y el stack de
ejecución, como el contexto dee ejecución. Sin embargo, toda
thread en un programa aun comparte muchos recursos, tales como espacio de
memoria y archivvos abiertos. Threads tambien son llamadas procesos
livianos (lightweight prrocess).
NOTA: Es mucho más simple crear y destruir uns thread que un proceso.
Thread Paralellas y Concurrentes
Cuando dos threads corren en paralelo, ambas están siendo corridas
al mismo tiempo en diferentes CPUs. Dos thread concurreentes están
en prrogreso, o intentanto de obtener timeppo de ejecución de la
CPU al mismo tiempo, pero no necesariamentte están corriento en forma
simultánea en dos CPUs diferentes.
Ejemplo: Programa de thread única
En el programa WithoutThread.java
, el método run() en la clase NoThreadPseudoIO es creado para simular
una operación dee IO de 10 segundos. El programa primero simulará
una operación de IO.
Métodos del Programa de Thread única
El metoddo showElapsedTime() imprime el tiempo en segundos desde que el
programa partió, junto con el mensaje deel usuario. El método
currentTimeMillis() de la clase System del paquete java.lang retorna un entero
que corresponndee a la diferencia de tiempo en milisegundos desde la hora
00:00:00 GMT on January 1, 1970. a la actual.
Ejemplo de programa Multithreded (multihilo)
El programa multithreaded WithThread.java
declara la clase para simular IO como una subclase de la clasee Thread.
Después que la thread es creada, el programa multithreaded usa el
método start() de la clase Thread para hacer partir la operación
de IO. El método start() a su vez llama a run() de la subclase.
Creación y ejecución de Threads
Hay dos formas de hacer que una tarea corra concurrentemente con otra
tarea: crear una nueva clase como subclase de la clase Thread o declarar
una clase e implementar lla interfaz Runnable.
Uso de Subclase
Cuando se crea una subclase de Thread, la subclase debería definir
su propio método run() para sobremontar el métoddo run() de
la clase Thread. La tarea concurrente es desarrollada en este método
run().
Ejecución del método run()
Una instancia de la subclase es creada con new, luego llamamos al método
start() de la thread para hacer que la máquina virtual Java
ejecute el método run().
Implementación de la Interface Runnable
La interfaz Runnable requiere que sólo un método sea
implementado, el método run(). Primero creamos una instancia de esta
clase con new, luego creamos una instancia de Thread con otra sentencia new
y usamos nuestra clase en el constructor. Finalmente, llamamos el método
start() de la instancia de Thread para iniciar la tarea definida en el método
run().
Indicar el Método run()
Una instancia de una clase que defina el método run() - ya sea como
subclase de Thread o implementando la interfaz Runnable - debe ser pasada
como argumento en la cración de una instancia de Thread. Cunado el
método start() de esta instancia es llamado de esta inatancia de Thread,
Java run time sabe qué método run() ejecutar.
Control de la Ejecución de una Thread
Varios métodos de la clase java.labg.Thread controlan la ejecución
de una thread. Java 2 dejó obsoleto (deprecated) varios de estos métodos
definidos en versiones previas (Java 1.0 y Java 1.1.) para prevenir inconsistencia
de datos y deadlock. Se recomienda evitar el uso de estos métodos.
Ellos son:
void stop() el cual detiene la ejecución de la thread no importando
consideración alguna.
void suspend() el cual para detener temporarlmente la ejecución
de una thraead.
void resume() reactiva una thread suspendida.
Métodos de uso común:
void start(): usado para iniciar el cuerpo de la thread definido por el
método run().
void sleep(): pone a dormir una thread por un tiempo mínimo
especificado.
void join(): usado para esperar por el término de la thread, por ejemplo
por término de método run().
void yield(): Mueve a la thread hacia la
Ciclo de Vida de una Thread
Sincronización
Deposit.java