Ejemplo de hilo en Java | Thread Java

Los hilos de ejecución en java están implementados en la clase Thread, que forma parte del paquete java.lang. Cada hilo tiene (thread) tiene un principio, un  flujo de ejecución y un fin definidos.

Los objetos hilo de java tienen cuatro posibles estados: nuevo, ejecutable, bloqueado, muerto.

Nuevo: A este estado se accede mediante la llamada a un constructor de la clase hilo, y durante el mismo el hilo aun no tiene asignados recursos.

Ejecutable: Se accede con una llamada al método start, este método asigna los recursos necesarios para ejecutar el hilo, planifica su ejecución y raliza una llamada a su método run, que es el que contiene el código con las acciones que debe realizar el hilo y habitualmente es un bucle.

Bloqueo: Un hilo puede estar bloqueado como consecuencia de: una llamada al método sleep, se tendrá así un hilo dormido que, alcabo de un cierto tiempo, despertara y pasara al estado ejecutable. El método  interrupt consigue  que un hilo dormido  se despierte inmediatamente, produciéndose una excepción.

Muerto: A este método se llega tras complementar el método run. El método stop de versiones anteriores ya no se usa en java2, debido a que en ocasionaba problemas por ejemplo por no limpiar, antes de finalizar la ejecución  de un hilo, el estado de los objetos con los que el mismo se encontraba trabajando.

Ejemplo :

public class PrincipalS
{
public static void main(String []aa)
{
Datos d=new Datos();
Productor p=new Productor(d);//genera datos y los //almacena en una estructura de tamaño limitado
Consumidor c=new Consumidor(d);// hilo que extrae los //mismos datos que el productor
}
}
class Datos
{
double[] ad; //arreglo de tipo double
int contador=-1; //asignación a una variable
public Datos()
{
ad = new double[4]; //definición del tamaño del arreglo
}
public void poner(double d)
{
while(contador<ad.length-1)
{
contador++;
ad[contador]=d*1000+contador;
}
}
public void quitar()
{
while(contador>=0)
{
double d=ad[contador];
contador–;
System.out.println(“Consume”+d);
}
}
}
class Productor implements Runnable
{
Thread hilo1;
Datos dtos;
int num=0;
public Productor(Datos d)
{
dtos=d;
hilo1=new Thread(this);
hilo1.start();
}
public void run()
{
for(int i=0;i<5;i++)
{
dtos.poner(i);
try
{
Thread.currentThread().sleep(100);
}
catch(InterruptedException e)
{
}
}
}
}
class Consumidor implements Runnable
{
Thread hilo2;
Datos dtos;
public Consumidor(Datos d)
{
dtos=d;
hilo2=new Thread(this);
hilo2.start();
}
public void run()
{
for(int i=0;i<5;i++)
{
dtos.quitar();
try
{
Thread.currentThread().sleep(100);
}
catch (InterruptedException e)
{
}
}
}
}