Introducción
Definición Thread

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.

Single Thread

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.

Two threads

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().

RunnableThread.java

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

MethodTest.java

Ciclo de Vida de una Thread

Thread life cycle

Sincronización
Deposit.java

Deposit2.java


Productor consumidor

NoWaitPandC.java
PandC.java