- Un hilo en Java es:
+ Una instancia de la clase java.lang.Thread
+ Un proceso en ejecución
- En una aplicación Java, el hilo principal es el derivado de la clase main, al cual llamamos proceso o hilo main.
- Cuando se trata de hilos, muy pocas cosas está garantizadas.
Más info tras el salto...
- Toda la acción o trabajo sucede dentro del método run().
- Para definir e instanciar un nuevo Thread (hilo, proceso) existen 2 formas:
+ Extendiendo (o heredando) a la clase java.lang.Thread
+ Implementando la interfaz Runnable
- Siempre se necesita un objeto tipo Thread para realizar el trabajo, independientemente si extiendes la clase Thread o implementas Runnable.
- Puedes pasar una misma instancia de una clase que implementa Runnable a diversos objetos de tipo Thread.
+ Thread()
+ Thread(objetoRunnable)
+ Thread(objetoRunnable, String nombre)
+ Thread(String nombre)
Comenzando con el trabajo::
hilo.start();
+ Un nuevo proceso de ejecución comienza (con su propia pila de información).
+ El hilo o proceso cambia de estado nuevo o new a estado de ejecución o runnable.
+ Cuando el hilo tenga su turno de ejecutarse, el método run() del objeto al que refiere se ejecuta.
P. ej.
public class Hilos {
public static void main(String[] args){
System.out.println("Dentro de main...");
HiloNuevo hn = new HiloNuevo();
Thread nuevoHilo = new Thread(hn);
nuevoHilo.start();
}
}
class HiloNuevo implements Runnable{
public HiloNuevo(){
System.out.println("Comenzando un HiloNuevo...");
}
public void run(){
System.out.println("Llamando al método run de HiloNuevo...");
for(int i=0;i<5;i++)
{
System.out.println(i);
}
System.out.println("Terminando el trabajo...");
}
}
Al ejecutar el código anterior nos da un resultado como el siguiente:
Dentro de main...
Comenzando un HiloNuevo...
Llamando al método run de HiloNuevo...
0
1
2
3
4
Terminando el trabajo...
Ejecutando varios hilos al mismo tiempo::
Vamos a analizar un ejemplo de 3 hilos realizando el mismo trabajo, comenzaremos con una clase que implementa la interfaz Runnable, la cual es instanciada y enviada a 3 diferentes hilos, posteriormente le damos un nombre a cada uno de ellos e iniciamos su trabajo con el método start().
public class Hilos {
public static void main (String[] args){
HiloNuevo hn = new HiloNuevo();
Thread uno = new Thread(hn);
Thread dos = new Thread(hn);
Thread tres = new Thread(hn);
uno.setName("Luis");
dos.setName("Carlos");
tres.setName("María");
uno.start();
dos.start();
tres.start();
}
}
class HiloNuevo implements Runnable{
public void run(){
for(int i=0;i<3;i++)
{
System.out.println("Comenzado por " + Thread.currentThread().getName() + ", i = "+i);
}
}
}
Una vez que ejecutamos lo anterior nos dará un resultado parecido a lo siguiente:
Comenzado por Luis, i = 0
Comenzado por Luis, i = 1
Comenzado por Luis, i = 2
Comenzado por Carlos, i = 0
Comenzado por Carlos, i = 1
Comenzado por Carlos, i = 2
Comenzado por María, i = 0
Comenzado por María, i = 1
Comenzado por María, i = 2
...¿o no?, si lo volvemos a ejecutar (al menos en mi máquina) obtengo lo siguiente:
Comenzado por Luis, i = 0
Comenzado por Carlos, i = 0
Comenzado por Luis, i = 1
Comenzado por Carlos, i = 1
Comenzado por Luis, i = 2
Comenzado por María, i = 0
Comenzado por María, i = 1
Comenzado por María, i = 2
Comenzado por Carlos, i = 2
"Cada hilo se iniciará y se ejecutará hasta que se complete"
Hasta aquí llega la segunda parte...
Más sobre programación en Java aquí.
Este blog ha sido eliminado por un administrador de blog.
ResponderBorrarMuy bueno.. Me has ayudado a aclarar el tema. Gracias.
ResponderBorrarDe verdad que me ayudo leer mucho sobre los Threads, era algo que no lo tenia muy claro, pero lo expresaste de una manera sencilla, facil de entender y muy completa.
ResponderBorrarMuchas gracias!
Hola, estuve pensando... deberias colocar un tema sobre semáforos en Java.. o si puedes colocar alguna información que lo explique de manera sencilla y con ejemplos para que uno pueda comenzar... gracias!
ResponderBorrarEn las proximas semanas estaré publicando sobre diversos temas en Java, la idea es cubrir por completo aquellos que se necesitan para pasar el examen de certificación SCJP, solo que he tenido una carga de trabajo un tanto intensa pero sigue visitando mi blog y pronto encontrarás muchos más temas sobre esto.
ResponderBorrarMuy buena la entrada, estoy estudiando ingenieria en Sistemas y me ha ayudado muchisimo. Saludos
ResponderBorrarMuy buen trabajo te felicito. Me esta ayudando mucho para mis tareas de Topicos selectos de programacion Grasias XD ^_^
ResponderBorrarMuchas gracias por los ejemplos; acabe de realizarlos y funcionan; solo tengo una pregunta como puedo asociarlos con las pilas de procesos, simulando la comunicacion entre el procesador y la memoria??
ResponderBorrarDe antemano milgracias por los ejemplos expuestos, me aclaran dudas y me generan otras!!
Excelente forma de explicar, muchisimas gracias por publicar tus conocimientos, lo que has aprendido y sobre todo tomarte el teimpo para explicarlo de una forma clara.
ResponderBorrarAmigo me has salvado la vida tu tip entre la diferencia en invocar al hilo con el metodo run y el start es genial. Yo usaba el run() por eso no habia indepedencia entre mis dos hilos activos. Eres crack...
ResponderBorrarEmmm..... Hola! Que tal?
ResponderBorrarRespecto al orden, pues a mi me funciono, o por el contrario no le lo ha devuelto en desorden... Utilizando el metodo sleep(1000) (el 1000 porque fue lo que quise poner) pero obviamente este es con el try cash...
Bueno en fin con este metodo utilizandolo en el constructor que implementa runnable o que extienda de thread como lo maneje, no me lo ha tirado en desorden!
Saludes!