{"id":2781,"date":"2018-03-07T02:05:01","date_gmt":"2018-03-07T07:05:01","guid":{"rendered":"https:\/\/www.manualjava.net\/?p=2781"},"modified":"2018-03-12T17:33:41","modified_gmt":"2018-03-12T22:33:41","slug":"estados-de-un-hilo","status":"publish","type":"post","link":"https:\/\/www.manualjava.net\/?p=2781","title":{"rendered":"Estados de un hilo"},"content":{"rendered":"<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-2796\" src=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/03\/java48.jpg\" alt=\"\" width=\"236\" height=\"101\" \/><\/p>\n<p><span style=\"color: #000000;\">Los hilos se crean como cualquier otro objeto de Java y duran hasta que finaliza el m\u00e9todo run(). Todo hilo pasa por cuatro estados:\u00a0<strong>creado, ejecutable, bloqueado, eliminado.\u00a0<\/strong><\/span><!--more--><\/p>\n<ul>\n<li><strong><span style=\"color: #000000;\">Creado.\u00a0<\/span><\/strong><span style=\"color: #000000;\">Este es el estado del hilo cuando se llama al constructor de la clase hilo. Todav\u00eda no tiene recursos asignados.<\/span><\/li>\n<li><strong><span style=\"color: #000000;\">Ejecutable.\u00a0<\/span><\/strong><span style=\"color: #000000;\">A este estado se accede cuando el hilo creado llama a start(). Este m\u00e9todo asigna recursos para la ejecuci\u00f3n del hilo, planifica su ejecuci\u00f3n y autom\u00e1ticamente llama al m\u00e9todo run(), que es donde se escriben las acciones a realizar por el hilo. Puede haber varios hilos ejecut\u00e1ndose; en un momento dado es uno de ellos el que est\u00e1 en ejecuci\u00f3n, los dem\u00e1s se encuentran ejecut\u00e1ndose.<\/span><\/li>\n<li><strong><span style=\"color: #000000;\">Bloqueado.\u00a0<\/span><\/strong><span style=\"color: #000000;\">Un hilo en estado bloqueado no realiza acci\u00f3n alguna, no recibe ciclos de CPU. Hasta que no se desbloquea no se le considera en la distribuci\u00f3n de tiempos de ejecuci\u00f3n. Un hilo pasa a estado bloqueado cuando llama al m\u00e9todo sleep() para dormirlo n milisegundos; o bien llamadas a otros m\u00e9todos como wait(), join() o yield(). Tambi\u00e9n, un hilo se bloquea cuando est\u00e1 a la espera de una operaci\u00f3n de entrada\/salida.<\/span><\/li>\n<li><span style=\"color: #000000;\"><strong>Eliminado.\u00a0<\/strong><\/span><span style=\"color: #000000;\">Una vez que el m\u00e9todo run() termina de ejecutarse el hilo pasa a estado eliminado. La clase Thread dispone del m\u00e9todo stop() para que un hilo pase a este estado; sin embargo desde Java 2 se desaconseja utilizar este m\u00e9todo por el riesgo de que queden objetos y recursos no liberados.<\/span><\/li>\n<\/ul>\n<p><span style=\"color: #000000;\">Los hilos, una vez creados, pasan c\u00edclicamente del estado ejecutable a bloqueado. El sistema se ocupa de asignar tiempos de CPU a los hilos en estado ejecutable. Cuando est\u00e1n en ejecuci\u00f3n, es el m\u00e9todo run() del hilo el que se ejecuta. Las acciones que bloquean temporalmente un hilo son:<\/span><\/p>\n<ul>\n<li><span style=\"color: #000000;\">Llamada al m\u00e9todo sleep() de la clase Thread. Este m\u00e9todo detiene la ejecuci\u00f3n del hilo durante un n\u00famero de milisegundos. La declaraci\u00f3n del m\u00e9todo es:<\/span><\/li>\n<\/ul>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0void sleep(long mills) throws InterruptedException<\/span><\/p>\n<ul>\n<li><span style=\"color: #000000;\">Ejecutar el m\u00e9todo wait(). Esta acci\u00f3n produce que el hilo se quede a la espera de que suceda un hecho que permita seguir con la ejecuci\u00f3n del hilo. Para que el hilo vuelva al estado ejecutable tiene que recibir una notificaci\u00f3n, mediante la llamada a notify(), o bien notifyAll(). Estos dos m\u00e9todos, y tambi\u00e9n wait(), est\u00e1n definidos en la clase Object. Su declaraci\u00f3n es:<\/span><\/li>\n<\/ul>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0final void notify()<br \/>\n<\/span>\u00a0 \u00a0 \u00a0 <span style=\"color: #000000;\">\u00a0final void notifyAll()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0final void wait() throws InterruptedException<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0final void wait(long mensaje) throws InterruptedException<br \/>\n<\/span><\/p>\n<ul>\n<li><span style=\"color: #000000;\">Estar a la espera de operaciones de entrada\/salida (leer un archivo, . . .).<\/span><\/li>\n<li><span style=\"color: #000000;\">Cuando desde un hilo un objeto llame a un m\u00e9todo declarado con el atributo\u00a0<strong>synchronized\u00a0<\/strong>y dicho objeto est\u00e9 bloqueado por otro hilo.<\/span><\/li>\n<\/ul>\n<p><span style=\"color: #000000;\">Normalmente el m\u00e9todo run() se dise\u00f1a con un bucle cuya ejecuci\u00f3n depende de una variable boolean, de tal forma que cuando se quiera detener cambie el estado de la variable. La clase Thread dispone del m\u00e9todo isAlive() que devuelve true si el hilo se encuentra en estado ejecutable o bloqueado. Un hilo activo no quiere decir que est\u00e9 en ejecuci\u00f3n, sino que no est\u00e1 eliminado y por consiguiente se puede utilizar. La declaraci\u00f3n del m\u00e9todo isAlive() es:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0boolean isAlive();<\/span><\/p>\n<p><span style=\"color: #000000;\">Otro m\u00e9todo de inter\u00e9s en el control de los hilos es join(). Un hilo espera la ejecuci\u00f3n de otro hilo mediante el uso de join(). Este m\u00e9todo hace que se bloquee la ejecuci\u00f3n del hilo hasta que termine la ejecuci\u00f3n del otro hilo que llama a join() (otroHilo.join()).<\/span><\/p>\n<p><span style=\"color: #000000;\">Ciclo de vida de un hilo.<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-2815 aligncenter\" src=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/03\/Hilo1-300x226.png\" alt=\"\" width=\"365\" height=\"275\" srcset=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/03\/Hilo1-300x226.png 300w, https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/03\/Hilo1.png 505w\" sizes=\"(max-width: 365px) 100vw, 365px\" \/><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">El programa crea tres hilos desde el hilo principal, es decir, desde main(). La ejecuci\u00f3n del programa permite activar una llamada a join(). Los resultados de la ejecuci\u00f3n ponen de manifiesto la funcionalidad de join(). La clase Tareas define el hilo, implementa la interfaz Runnable. El m\u00e9todo run() tiene un bucle con un mensaje a pantalla y llamada a sleep() con el fin de que el estado del hilo pase a bloqueado y se ejecute otro hilo.<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public class Tareas implements Runnable{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 private String mensaje;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 private Thread hilo;<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 public Tareas(String mensaje){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0this.mensaje = mensaje;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0hilo = new Thread(this,mensaje);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0System.out.println(\u00abCreaci\u00f3n de hilo: \u00bb + hilo);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0hilo.start();\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ ejecut\u00e1ndose<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @Override<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 public void run() {<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0try{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0for(int i=6;i&gt;0;i-=2){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 System.out.println(\u00abHilo: \u00bb +hilo+ \u00abi = \u00bb + i);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 hilo.sleep(1000);\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ Hilo \u00abdurmiendo\u00bb, queda bloqueado<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}catch(InterruptedException ex) {<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ex.printStackTrace();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0System.out.println(\u00abFinaliza hilo: \u00bb + mensaje);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0import java.util.Scanner;<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public class TresHilosJoin{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 public static void main(String[] args){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Scanner entrada = new Scanner(System.in);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 int opcion;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 do{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 System.out.println(\u00ab[1]. Ejecutar con join()\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 System.out.println(\u00ab[2]. Ejecutar sin join()\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 System.out.print(\u00abIngresar opci\u00f3n(1-2): \u00ab);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 opcion = entrada.nextInt();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }while(opcion!=1 &amp;&amp; opcion!=2);<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 System.out.println(\u00ab&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\u00ab);<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ se crean tres hilos<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Tareas t1, t2, t3;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 t1 = new Tareas(\u00abPrimero\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 t2 = new Tareas(\u00abSegundo\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 t3 = new Tareas(\u00abTercero\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 System.out.println(\u00abHilo ejecut\u00e1ndose: \u00bb + Thread.currentThread());<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if(opcion==1){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0System.out.println(\u00abCada hilo llamada a join()\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0try{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0t1.hilo.join();\u00a0 \u00a0 \u00a0 \u00a0\/\/ Hilo actual \u00abbloqueado\u00bb hasta finalizar t1<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0t2.hilo.join();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0t3.hilo.join();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0catch(InterruptedException ex){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0ex.printStackTrace();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 else<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0System.out.println(\u00abNo hay llamada a join()\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 System.out.println(\u00abFinaliza hilo main()\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<p><span style=\"color: #000000;\">Al ejecutar el programa con la opci\u00f3n 1 se obtiene:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0[1]. Ejecutar con join()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0[2]. Ejecutar sin join()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Ingresar opci\u00f3n(1-2): 1<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Creaci\u00f3n de hilo: Thread[Primero,5,main]<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Creaci\u00f3n de hilo: Thread[Segundo,5,main]<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Creaci\u00f3n de hilo: Thread[Tercero,5,main]<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo ejecut\u00e1ndose: Thread[main,5,main]<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Cada hilo llamada a join()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Primero,5,main]\u00a0 \u00a0i = 6<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Segundo,5,main]\u00a0 i = 6<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Tercero,5,main]\u00a0 \u00a0 i = 6<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Segundo,5,main]\u00a0 i = 4<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Tercero,5,main]\u00a0 \u00a0 i = 4<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Primero,5,main]\u00a0 \u00a0i = 4<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Primero,5,main]\u00a0 \u00a0i = 2<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Segundo,5,main]\u00a0 i = 2<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Tercero,5,main]\u00a0 \u00a0 i = 2<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Finaliza hilo: Primero<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Finaliza hilo: Segundo<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Finaliza hilo: Tercero<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Finaliza hilo main()<\/span><\/p>\n<p><span style=\"color: #000000;\">Al ejecutar el programa con la opci\u00f3n 2 se obtiene:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0[1]. Ejecutar con join()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0[2]. Ejecutar sin join()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Ingresar opci\u00f3n(1-2): 2<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Creaci\u00f3n de hilo: Thread[Primero,5,main]<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Creaci\u00f3n de hilo: Thread[Segundo,5,main]<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Creaci\u00f3n de hilo: Thread[Tercero,5,main]<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo ejecut\u00e1ndose: Thread[main,5,main]<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0No hay llamada a join()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Finaliza hilo main()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Primero,5,main]\u00a0 \u00a0i = 6<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Tercero,5,main]\u00a0 \u00a0 i = 6<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Segundo,5,main]\u00a0 i = 6<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Segundo,5,main]\u00a0 i = 4<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Primero,5,main]\u00a0 \u00a0i = 4<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Tercero,5,main]\u00a0 \u00a0 i = 4<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Primero,5,main]\u00a0 \u00a0i = 2<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Segundo,5,main]\u00a0 i = 2<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Hilo: Thread[Tercero,5,main]\u00a0 \u00a0 i = 2<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Finaliza hilo: Segundo<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Finaliza hilo: Primero<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Finaliza hilo: Tercero<\/span><\/p>\n<p><span style=\"color: #000000;\">Observe que en esta ejecuci\u00f3n termina el hilo del m\u00e9todo main() antes de los tres hilos creados desde main(). Por contra, la ejecuci\u00f3n con la opci\u00f3n 1 (llamada a join()) main() termina en \u00faltimo lugar. Esto se debe a que la llamada a join() desde el hilo principal provoca que este se quede a la espera de que termine la ejecuci\u00f3n de cada uno de los tres hilos implementados en Tareas.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los hilos se crean como cualquier otro objeto de Java y duran hasta que finaliza el m\u00e9todo run(). Todo hilo pasa por cuatro estados:\u00a0creado, ejecutable, bloqueado, eliminado.\u00a0<\/p><p><a class=\"more-link btn\" href=\"https:\/\/www.manualjava.net\/?p=2781\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2796,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"_links":{"self":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2781"}],"collection":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2781"}],"version-history":[{"count":32,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2781\/revisions"}],"predecessor-version":[{"id":2898,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2781\/revisions\/2898"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/media\/2796"}],"wp:attachment":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2781"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2781"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}