{"id":2747,"date":"2018-03-07T00:06:48","date_gmt":"2018-03-07T05:06:48","guid":{"rendered":"https:\/\/www.manualjava.net\/?p=2747"},"modified":"2018-03-07T21:16:27","modified_gmt":"2018-03-08T02:16:27","slug":"creacion-de-hilos","status":"publish","type":"post","link":"https:\/\/www.manualjava.net\/?p=2747","title":{"rendered":"Creaci\u00f3n de hilos"},"content":{"rendered":"<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-2750\" src=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/03\/java47.gif\" alt=\"\" width=\"260\" height=\"80\" \/><\/p>\n<p><span style=\"color: #000000;\">Un programa puede necesitar realizar m\u00e1s de una tarea al mismo tiempo, de tal forma que el programa arranque distintos hilos (threads) de ejecuci\u00f3n, realizando acciones diferentes. Los navegadores (Explorer, Firefox, Chrome, . . .) ejecutan m\u00faltiples hilos (procesos) para llevar a cabo su trabajo, es decir la descarga y visualizaci\u00f3n de una p\u00e1gina web.\u00a0<\/span><!--more--><\/p>\n<p><span style=\"color: #000000;\">Un hilo dispone de sus propios recursos, aunque puede compartir recurso con otros hilos, como por ejemplo un archivo. Un hilo no puede ejecutarse fuera del programa en que se encuentra, no es un programa en s\u00ed mismo. Un hilo puede ejecutar cualquier tarea, basta con indicarlo en el m\u00e9todo run() (clase Thread), que es el que determina la actividad principal de los hilos.<\/span><\/p>\n<p><span style=\"color: #000000;\">Java permite crear hilos de dos formas:<\/span><\/p>\n<p><span style=\"color: #000000;\">1. La clase que vaya a ejecutar procesos concurrentes debe declarar que implementa la interfaz Runnable (java.lang). Esta interfaz solo define el m\u00e9todo run(). Dentro de este m\u00e9todo ser\u00e1 donde se pongan las acciones (sentencias) que se ejecutar\u00e1n de forma concurrente.<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0class ClaseConcurrente implements Runnable{<\/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}<\/span><\/p>\n<p><span style=\"color: #000000;\">Para crear y activar un hilo basado en la clase que implementa Runnable se instancia un objeto<\/span><br \/>\n<span style=\"color: #000000;\">ClaseConcurrente y despu\u00e9s un objeto de la clase Thread al que se le asocia el objeto ClaseConcurrente:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0ClaseConcurrente objetoTarea = new ClaseConcurrente(par\u00e1metros);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Thread hilo = new Thread(objetoTarea);<\/span><\/p>\n<p><span style=\"color: #000000;\">Para poner en marcha el hilo:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0hilo.start()<\/span><\/p>\n<p><span style=\"color: #000000;\">2.\u00a0 \u00a0Declarar la clase con procesos concurrentes derivada de la clase Thread. La nueva clase hereda todos los m\u00e9todos de Thread; deber\u00e1 redefinir el m\u00e9todo run(), que ser\u00e1 donde se sit\u00faen las acciones a ejecutar.<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0class ClaseConcurrente extends Thread{<\/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}<\/span><\/p>\n<p><span style=\"color: #000000;\">Para crear un hilo basado en la clase que hereda de Thread se instancia un objeto de la clase ClaseConcurrente:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0ClaseConcurrente hilo = new ClaseConcurrente(par\u00e1metros);<\/span><\/p>\n<p><span style=\"color: #000000;\">o bien,<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Thread hilo = new ClaseConcurrente(par\u00e1metros);<\/span><\/p>\n<p><span style=\"color: #000000;\">Para poner en marcha el hilo:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0hilo.start()<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">Se crean dos hilos mediante una clase que implementa la interfaz Runnable.<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0\/\/ clase dise\u00f1ada para crear hilos<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public class ClaseHilo implements Runnable{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 private Thread hilo;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 private String entrada;<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 public ClaseHilo(String m){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0entrada = m;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0hilo = new Thread(this);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0hilo.start();<\/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 \/\/ m\u00e9todo en el que se definen las acciones a realizar por el hilo<\/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 \u00a0System.out.println(\u00abComienza ejecuci\u00f3n de: \u00bb + entrada);<\/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 \u00a0 \u00a0Thread.sleep(1000);<\/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 \u00a0catch(InterruptedException er){<\/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(\u00abExcepci\u00f3n: \u00bb + er);<\/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(\u00abFin de la ejecuci\u00f3n de: \u00bb + entrada);<\/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 \u00a0public class PruebaDeHilo {<\/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 \u00a0ClaseHilo h1, h2;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0h1 = new ClaseHilo(\u00abPrimer hilo\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0h2 = new ClaseHilo(\u00abSegundo hilo\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;\">La interfaz Runnable declara el m\u00e9todo run(). Toda clase que implemente esa interfaz debe definir dicho m\u00e9todo. En el ejemplo, la clase ClaseHilo implementa a Runnable y define run() de tal forma que escribe una cadena y \u00abduerme\u00bb (detiene la ejecuci\u00f3n) durante 1000 milisegundos. El m\u00e9todo sleep() propaga la excepci\u00f3n InterruptedException, que es necesario comprobar en un bloque try-catch.<\/span><\/p>\n<p><span style=\"color: #000000;\">El constructor de ClaseHilo se encarga de crear y activar (iniciar) la ejecuci\u00f3n del hilo, con las sentencias:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0hilo = new Thread(this);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0hilo.start();<\/span><\/p>\n<p><span style=\"color: #000000;\">Observar que en este contexto this referencia al objeto que implementa a Runnable.<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>A recordar<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">La interfaz Runnable declara el m\u00e9todo abstracto run(). Este no tiene argumentos, no devuelve tipo alguno. En la redefinici\u00f3n de run() se especifican las acciones a realizar por el hilo, o hilos, de ejecuci\u00f3n que se creen a partir de la clase que implementa a Runnable.<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Declaraci\u00f3n: public void run()<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">Se crean dos hilos mediante una clase que deriva de Thread. La funcionalidad es la misma que la del ejemplo anterior.<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public class PruebaDeHilo {<\/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 \u00a0ClaseHilo h1, h2;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0h1 = new ClaseHilo(\u00abPrimer hilo\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0h2 = new ClaseHilo(\u00abSegundo hilo\u00bb);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ se pone en marcha la ejecuci\u00f3n de los dos hilos<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0h1.start();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0h2.start();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \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 \u00a0\/\/ clase dise\u00f1ada para crear hilos<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public class ClaseHilo extends Thread{<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 private String entrada;<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 public ClaseHilo(String m){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0entrada = m;<\/span><br \/>\n<span style=\"color: #000000;\">\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 \/\/ m\u00e9todo en el que se definen las acciones a realizar por el hilo<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \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 \u00a0 \u00a0System.out.println(\u00abComienza ejecuci\u00f3n de: \u00bb + entrada);<\/span><br \/>\n<span style=\"color: #000000;\">\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 \u00a0sleep(1000);<\/span><br \/>\n<span style=\"color: #000000;\">\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 \u00a0catch(InterruptedException er){<\/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 \u00a0System.out.println(\u00abExcepci\u00f3n: \u00bb + er);<\/span><br \/>\n<span style=\"color: #000000;\">\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 \u00a0System.out.println(\u00abFin de la ejecuci\u00f3n de: \u00bb + entrada);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \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;\">En el ejemplo, la clase ClaseHilo redefine el m\u00e9todo run() heredado de Thread. Este escribe la cadena pasada al constructor y \u00abduerme\u00bb (detiene la ejecuci\u00f3n) durante 1000 milisegundos. Ahora el m\u00e9todo sleep() es heredado por ClaseHilo, se puede decir que es un m\u00e9todo de la clase, por eso se puede llamar directamente.<\/span><\/p>\n<h2><span style=\"color: #000000;\"><strong>Criterios a seguir para elegir c\u00f3mo crear un hilo<\/strong><\/span><\/h2>\n<p><span style=\"color: #000000;\">La primera forma de crear un hilo, clase que implementa Runnable, se utiliza con m\u00e1s frecuencia. Permite a la clase heredar de otra clase. La creaci\u00f3n de applets siempre se hace mediante una clase que hereda de JApplet, por ello, si en el applet se crean hilos se utilizar\u00e1 este m\u00e9todo. La declaraci\u00f3n de la clase ser\u00e1:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public class MiApplet extends JApplet implements Runnable<\/span><\/p>\n<p><span style=\"color: #000000;\">La segunda forma descrita para crear un hilo, derivar de Thread, tiene la bondad de la derivaci\u00f3n de clases; todos los m\u00e9todos de Thread son heredados por la subclase. El principal inconveniente es que solo se puede derivar de una clase, por consiguiente esta forma cierra la herencia de otras clases.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un programa puede necesitar realizar m\u00e1s de una tarea al mismo tiempo, de tal forma que el programa arranque distintos hilos (threads) de ejecuci\u00f3n, realizando acciones diferentes. Los navegadores (Explorer, Firefox, Chrome, . . .) ejecutan m\u00faltiples hilos (procesos) para llevar a cabo su trabajo, es decir la descarga y visualizaci\u00f3n de una p\u00e1gina web.\u00a0<\/p><p><a class=\"more-link btn\" href=\"https:\/\/www.manualjava.net\/?p=2747\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2750,"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\/2747"}],"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=2747"}],"version-history":[{"count":39,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2747\/revisions"}],"predecessor-version":[{"id":2791,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2747\/revisions\/2791"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/media\/2750"}],"wp:attachment":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}