Saludos Amigos de la lista. Bueno, esta es la primera vez que Victor y yo, elaboramos la LECCION 5 desde puntos diferentes, disculpen si en estos ultimos 10 dias enviaron correos a mi casilla,anterior (ahuamani@beta.upc.edu.pe) que no he respondido, y es porque ahora tengo una nueva direccion electronica (ahuamani@telematic.edu.pe) por este lado del ciberespacio, estoy liderando el proyecto de Telematic-CPI, que dentro de poco lanzara al mercado una serie de nuevos servicios relacionados a Internet. bueno no los molesto Abajo tienen la leccion Ah, en la seccion parche,mil disculpas. Angel Huamani Mejia / ahuamani@telematic.edu.pe Victor Anorga Zavala / vanorga@beta.upc.edu.pe Hasta la Proxima! ----------LECCION 5--------------------------- THREAD (Procesos ) Un proceso es similar a una secuencia de programas que tiene un inicio y un fin sin embargo los procesos por si mismos no son programas, en otras palabras, un proceso es un flujo secuencial de control dentro de un programa. Los procesos en Java estan implementados en la clase (Thread) la cual es parte del paquete (java.lang). EL CUERPO DE UN PROCESO Utilizando el metodo run() seguido de un proceso que previamente a sido creado e inicializado, es como se define basicamente el cuerpo de un porceso, luego en tiempo de ejecucion el sistema llamara al metodo run(). Un ejemplo de un simple proceso. class proceso1 extends Thread { public proceso1(String str) { super(str); } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) {} } System.out.println("Listo " + getName()); } } ESTADOS DE LOS PROCESOS New Thread Para crear un nuevo proceso utilizamos la siguiente sentencia: Thread procesonuevo = new ProcesosClass(); luego de esta sentencia el proceso no se inicia, se queda en el estado (New Thread) , con este estado un proceso es equivalente a un objeto proceso vacio, y solo puede ser iniciado start() o stop(). Runnable Consideremos ahora las siguientes lineas de codigo: Thread proceso1 = new procesoClass(); proceso1.start(); El metodo start() crea los recursos necesarios para ejecutar el proceso, calcula el proceso a ejecutar y llama al metodo run(), en este momento el proceso se encuentra en el estado (Runnable). No Runnable Un proceso se encuentra en el estado "No Runnable", cuando ocurre alguno de estos eventos: * Se llamo al metodo sleep() * Se llamo al metodo suspend() * El proceso usa el metodo wait(), para poner en pausa baja alguna condicion. * El proceso es bloqueado por I/O. Por ejemplo en el siguiente codigo: Thread proceso1 = new procesoClass(); proceso1.start(); try { proceso1.sleep(5000); } catch (InterruptedException e) { } La linea: proceso1.sleep(5000); envia a dormir al proceso1 por 5 segundos. Dead Un proceso puede ser eliminado de 2 formas: - por muerte natural ;-)) - o por el metodo stop() por ejemplo: public void run() { int j = 0; while (j < 50) { j++; System.out.println("j = " + j); } } Aqui el bucle while, itera 50 veces luego termina, un proceso con el metodo run() tiene muerte natural cuando el bucle a terminado. Ahora, tambien se puede eliminar un proceso en cualquier momento al llamar al metodo stop(), por ejemplo: Thread proceso1 = new procesoClass(); proceso1.start(); try { Thread.currentThread().sleep(5000); } catch (InterruptedException e) { } proceso1.stop(); Aqui, se inicia proceso1: con proceso1.start(); luego el proceso activo, es enviado a dormir por 5 segundos, luego de los cuales proceso1, muere con: proceso1.stop() IllegalThreadStateException En tiempo de ejcucion se genera una IllegalThreadStateException cuando usted llama a un metodo en un proceso y el estado del proceso no le permite llamar al metodo, por ejemplo si el metodo suspend(), es invocado cuando el proceso es "No Runnable" --------------------------------------------- Aqui un parche que sera enviado lo mas pronto posible, mil disculpas --------------------------------------------- INTRODUCCION A LOS APPLET'S Los applets de java son miniprogramas que pueden ejecutarse desde un browser World Wide Web usando marcas especiales, cuando el browser carga una pagina que contiene un applet, el browser descarga el applet desde el servidor Web y lo ejecuta en el sistema local. El mensaje que aparece en la parte inferior del browser cuando carga una pagina que contiene un Applet, es similar al siguiente: "initializing... starting..." esto indica que el applet, se esta cargando entonces que esta pasando? * Una instancia de la clase applet es creada * El applet se inicializa a si mismo. * El applet empieza a ejecutarse. Cuando el usuario se encuentra en una pagina web, que contiene un applet y salta a otra pagina entonces el applet se detiene (stopping) a si mismo, y si el usuario retorna a la pagina el applet, vuelve a ejecutarse (start) nuevamente. Cuando el usuario sale del browser el applet, tiene un tiempo para detenerse y hacer una limpieza final antes de salir del browser. Estructura de un Applet. public class Miapplet extends Applet { ........ ........ public void init() { .......} public void start() { .......} public void stop() { .......} public void destroy() { .......} ......... } init() permite inicializar el applet cada vez que este es cargado o recargado. start() inicia la ejecucion del applet una vez cargado o cuando el usuario regresa a la pagina. stop() detiene la ejecucion del applet como cuando se sale del browser. destroy() antes de salir del browser hace la limpieza final. Veamos algunos ejemplos: class Applet1 extends Applet { ............ public void paint(Graphics g) { ........} ........... } El metodo paint() es el metodo basico para displayar informacion, y el metodo update() puede ser usado con paint() para una mejor performance en el pintado. Aqui el famoso programa HelloWorld, escrito como un applet de java. import java.awt.Graphics; import java.applet.Applet; public class HelloWorld extends Applet{ public void paint(Graphics g){ g.drawString("Helloworld",50,25); } } Explicando.... *En primer lugar recuerde que debe guardar el programa como: HelloWorld.java luego utilizar el compilador (javac) para compilar HelloWorld.java si todo es correcto le devolvera HelloWorld.class drawString es un metodo de la clase Graphics del paquete java.awt drawString(String str, int x, int y) permite dibujar una cadena de caracteres usando los siguientes parametros: str La cadena a ser dibujada x La coordenada x y La coordenada y COMO INCLUIR UN APPLET EN UNA PAGINA HTML Usamos este tag especial el cual es una extension HTML, de la siguiente forma: A ver como nos va..
Explicando.... CODE El atributo code indica el nombre de la clase, es decir el archivo que contiene el applet, incluyendo la extension (class) en este caso el archivo class debe estar en el mismo directorio que el archivo HTML. Si desea almacenar sus clases en un directorio diferente al directorio donde se almacenan sus archivos HTML, entonces debera usar CODEBASE, CODE contiene solamente el nombre de la clase (applet) mientras que CODEBASE contiene la ruta donde se encuentran sus clases. WIDTH y HEIGHT establecen el tamano para el applet. UN SEGUNDO EJEMPLO: import java.awt.Graphics; import java.applet.Applet; public class Applet2 extends Applet{ String texto; public void init(){ texto=getParameter("text"); } public void paint(Graphics g){ g.drawString(texto,50,25); } } *Como es de esperar este archivo debera guardarse como Applet2.java luego de ser compilado les devolvera el applet, Applet2.class Explicando.... getParameter es un metodo de la clase Applet del paquete java.applet la sintaxis: getParameter(String str) retorna el valor del parametro str en el tag HTML por ejemplo: Al llamar a getParameter("speed") retorna el valor 5 Codigo HTML: A ver como nos va..
y Ahora que sigue...
Prioridad en la ejecucion de tareas ----------------------------------- Anteriormente se dijo que los procesos se ejecutan concurrentemente. Conceptualmente esto es verdadero, pero en la practica no acurre asi. Muchas computadoras tienen un simple CPU (nos estamos refiriendo especificamente al microprocesador) por lo tanto este solo puede ejecutar una instruccion a la vez y esta instruccion a su vez corresponde a un programa cargado en la memoria. Pueden haber muchos programas cargados en la memoria. Quien decide que programa debe ejecutarse es el planificador de procesos que asigna un tiempo de CPU a cada una de los procesos en espera de acuerdo a su una prioridad. Cuando se vence el tiempo de ejecucion de un proceso y esta no se ha completado se guarda la posicion en donde se quedo la ejecucion de programa para ser usada luego cuando se tenga que retomar la ejecucion de este proceso. Seguidamente la CPU ejecuta el siguiente proceso en espera. Todo este esquema de ejecucion le da la ilucion al usuario de la computadora que esta esta ejecutando varios procesos concurrentemente. El ejecutor de programas de Java soporta este modelo de manera muy simple, con un planificador deterministico. Que utiliza un algoritmo conocido como planificador de prioridad fija. Este algoritmo planificador de procesos se basa en la prioridad del proceso pero tomando en cuenta tambien los otros procesos de tipo Runnable. Cuando un proceso en Java es creado, esta hereda la prioridad del proceso que lo creo (hereda la prioridad de su padre). Se puede modificar la prioridad de los procesos en cualquier momento luego de su creacion usando el metodo setpriority(). La prioridad del proceso se expresa en numeros que estan en van desde MIN_PRIORITY hasta MAX_PRIORITY (constantes definidas en la clase Thread). El proceso que tiene el numero mas alto es la que se ejecuta primero. Cuando varios procesos estan listos para se ejecutadas el planificador de Java elige aquella que es del tipo Runnable. Este codigo fuente de Java implementa un applet que anima una carrera entre dos procesos runner con diferentes prioridades. Cuando se clickea el mouse sobre el applet comienza la carrera. El primer proceso tiene una prioridad de 2 y el segundo proceso 3. Este es el metodo run() para ambos runners : public int tick = 1; public void run() { while (tick < 400000) { tick++; } } Este metodo run() simplemente cuenta desde 1 a 400,000. La variable de instancia tick es publica porque el applet usa este valor para determinar que tanto ha progresado el runner. Adicionalmente a los dos procesos runner este applet tiene un tercer proceso que se encarga de dibujar. El metodo run() del proceso que dibuja contiene un loop infinito; durante cada interaccion del loop este dibuja una linea por cada runner. La tarea que dibuja tiene una prioridad de 4. Procesos Demonios (Threads Daemon) ---------------------------------- Cualquier proceso en java puede ser un demonio. Los procesos demonio son servicios provistos por otros procesos ejecutandose desde el mismo proceso como proceso demonio. Por ejemplo el browser HotJava usa hasta cuatro procesos demonio de nombre "Image Fetchar" para traer imagenes desde el sistema de ficheros del host remoto cuando los procesos lo requieran. El metodo run() para un proceso demonio es tipicamente un loop infinito que espera por el requerimiento de un servicio. Para especificar que un proceso es un demonio llama al metodo setDaemon() con el argumento true. Para determinar si un thread es un demonio usar el metodo isdaemon() ------------------Hasta Aqui------------------------------- Hasta Pronto!! Angel Huamani Mejia / ahuamani@telematic.edu.pe Victor Anorga Zavala/ vanorga@beta.upc.edu.pe