Vous êtes sur la page 1sur 22

LENGUAJE DE PROGRAMACIN V

I. TECNOLOGA JAVA Java: Tecnologa desarrollada por Sun Microsystems para aplicaciones software independiente de la plataforma, que engloba: Lenguaje de programacin Java, un lenguaje de programacin de alto nivel, orientado a objetos. API Java, provista por los creadores donde el mximo exponente del lenguaje Java y que proporciona a los programadores un entorno de desarrollo completo, as como una infraestructura. Mquina Virtual de Java (JVM), la mquina virtual que ejecuta bytecode de Java. Tambin se refiere a la parte de la plataforma Java que se ejecuta en el PC, el entorno en tiempo de ejecucin de Java (JRE, Java Runtime Environment). Applet Java Java Runtime Environment Plataforma Java, la mquina virtual de Java, junto con las APIs: o Java 2 Enterprise Edition es la edicin empresarial del paquete Java. o Plataforma Java, Edicin Micro, orientada a dispositivos de prestaciones reducidas. o OpenJDK Plataforma Java liberada bajo licencia GPL v2

a. LENGUAJE DE PROGRAMACIN JAVA Java es un lenguaje de programacin orientado a objetos desarrollado por Sun Microsystems a principios de los aos 90. El lenguaje en s mismo toma mucha de su sintaxis de C y C++, pero tiene un modelo de objetos ms simple y elimina herramientas de bajo nivel, que suelen inducir a muchos errores, como la manipulacin directa de punteros o memoria. Las aplicaciones Java estn tpicamente compiladas en un bytecode, aunque la compilacin en cdigo mquina nativo tambin es posible. En el tiempo de ejecucin, el bytecode es normalmente interpretado o compilado a cdigo nativo para la ejecucin, aunque la ejecucin directa por hardware del bytecode por un procesador Java tambin es posible. La implementacin original y de referencia del compilador, la mquina virtual y las libreras de clases de Java fueron desarrollados por Sun Microsystems en 1995. Desde entonces, Sun ha controlado las especificaciones, el desarrollo y evolucin del lenguaje a travs del Java Community Process, si bien otros han desarrollado tambin implementaciones alternativas de estas tecnologas de Sun, algunas incluso bajo licencias de software libre. HISTORIA: La tecnologa Java se cre como una herramienta de programacin para ser usada en un proyecto de set-top-box en una pequea operacin denominada the Green Project en Sun Microsystems en el ao 1991. El equipo (Green Team), compuesto por trece personas y dirigido por James Gosling. El lenguaje se denomin inicialmente Oak (por un roble que haba fuera de la oficina de Gosling), luego pas a denominarse Green tras descubrir que Oak era ya una marca comercial registrada para adaptadores de tarjetas grficas y finalmente se renombr a Java.
Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

Origen del trmino JAVA: o Cafetera frecuentada por algunos de los miembros del equipo. o Podra tratarse de las iniciales de sus creadores: James Gosling, Arthur Van Hoff, y Andy Bechtolsheim. o Otros abogan por el siguiente acrnimo, Just Another Vague Acronym ("slo otro acrnimo ambiguo ms"). La hiptesis que ms fuerza tiene es la que Java debe su nombre a un tipo de caf disponible en la cafetera cercana. Un pequeo signo que da fuerza a esta teora es que los 4 primeros bytes (el nmero mgico) de los archivos .class que genera el compilador, son en hexadecimal, 0xCAFEBABE. Otros simplemente dicen que el nombre fue sacado al parecer de una lista aleatoria de palabras. Filosofa: El lenguaje Java se cre con cinco objetivos principales: o o o o o Debera Debera Debera Debera Debera usar la metodologa de la programacin orientada a objetos. permitir la ejecucin de un mismo programa en mltiples sistemas operativos. incluir por defecto soporte para trabajo en red. disearse para ejecutar cdigo en sistemas remotos de forma segura. ser fcil de usar y tomar lo mejor de otros lenguajes orientados a objetos, como C++.

b. API Java o El API Java es una Interfaz de Programacin de Aplicaciones (API: por sus siglas en ingles) provista por los creadores del lenguaje Java, y que da a los programadores los medios para desarrollar aplicaciones Java. o Como el lenguaje Java es un Lenguaje Orientado a Objetos, la API de Java provee de un conjunto de clases utilitarias para efectuar toda clase de tareas necesarias dentro de un programa. o La API Java est organizada en paquetes lgicos, donde cada paquete contiene un conjunto de clases relacionadas semnticamente. En la comunidad de desarrollo Java se suele identificar cada una de las diferentes libreras existentes como API's java. Cuando se construye un sistema informtico este suele emplear diversas APIs. Existen numerosas API's de Java para realizar todo tipo de operaciones, algunas de las ms conocidas son: o o o JAXP: Para procesar XML's. Servlets: Para facilitar la implementacin de soluciones web. Hibernate: Para facilitar la implementacin de persistencia.

c. MQUINA VIRTUAL JAVA Una Mquina virtual Java (en ingls Java Virtual Machine, JVM) es un programa nativo, es decir, ejecutable en una plataforma especfica, capaz de interpretar y ejecutar instrucciones expresadas en un cdigo binario especial (el Java bytecode), el cual es generado por el compilador del lenguaje Java. El cdigo binario de Java no es un lenguaje de alto nivel, sino un verdadero cdigo mquina de bajo nivel, viable incluso como lenguaje de entrada para un microprocesador fsico. Como todas las piezas del rompecabezas Java, fue desarrollado originalmente por Sun Microsystems.

Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

La JVM es una de las piezas fundamentales de la plataforma Java. Bsicamente se sita en un nivel superior al Hardware del sistema sobre el que se pretende ejecutar la aplicacin, y este acta como un puente que entiende tanto el bytecode, como el sistema sobre el que se pretende ejecutar. As, cuando se escribe una aplicacin Java, se hace pensando que ser ejecutada en una mquina virtual Java en concreto, siendo sta la que en ltima instancia convierte de cdigo bytecode a cdigo nativo del dispositivo final. La gran ventaja de la mquina virtual java es aportar portabilidad al lenguaje de manera que desde Sun Microsystems se han creado diferentes mquinas virtuales java para diferentes arquitecturas y as un programa .class escrito en un Windows puede ser interpretado en un entorno Linux. Tan solo es necesario disponer de dicha mquina virtual para dichos entornos. De ah el famoso axioma que sigue a Java, "escrbelo una vez, ejectalo en cualquier parte", o "Write once, run anywhere". Entorno de Ejecucin: Para poder ejecutar una aplicacin en una Mquina Virtual de Java, el programa cdigo debe compilarse de acuerdo a un formato binario portable estandarizado, normalmente en forma de ficheros con extensin .class. Un programa puede componerse de mltiples clases, en cuyo caso cada clase tendr asociada su propio archivo .class. Para facilitar la distribucin de aplicaciones, los archivos de clase pueden empaquetarse juntos en un archivo con formato jar. El cdigo resultante de la compilacin es ejecutado por la JVM que lleva a cabo la emulacin del conjunto de instrucciones, bien por un proceso de interpretacin o ms habitualmente mediante un compilador JIT (Just In Time), como el HotSpot de Sun. Esta ltima opcin convierte el bytecode a cdigo nativo de la plataforma destino, lo que permite una ejecucin mucho ms rpida. El inconveniente es el tiempo necesario al principio para la compilacin. El verificador del bytecode: La JVM verifica todo bytecode antes de ejecutarlo. Esto significa que solo una cantidad limitada de secuencias de bytecode forman programas vlidos, por ejemplo una instruccin JUMP (branch) puede apuntar solo a una instruccin dentro de la misma funcin. A causa de esto, el hecho de que JVM es una arquitectura de pila no implica una carga en la velocidad para emulacin sobre arquitecturas basadas en registros cuando usamos un compilador JIT: no hay diferencia para un compilador JIT si nombra registros con nombres imaginarios o posiciones de pila imaginarias que necesitan ser ubicadas a los registros de la arquitectura objetivo. Bytecodes: o o o o o o o o o La JVM tiene instrucciones para los siguientes grupos de tareas Carga y Almacenamiento Aritmticas Conversin de tipos Creacin y manipulacin de objetos Gestin de pilas (push / pop) Transferencias de Control (branching) Invocacin y retorno a Mtodos Lanzar excepciones

La clave es la compatibilidad binaria. Cada sistema operativo de un host particular necesita su propia implementacin de JVM y runtime. Estas JVMs interpretan el byte code semnticamente de la misma manera, pero la implementacin actual puede variar

Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

d. Applet JAVA Un applet Java es un applet escrito en el lenguaje de programacin Java. Los applets de Java pueden correr en un navegador web utilizando la Java virtual machine (JVM), o en el AppletViewer de Sun. En Java un applet, es un programa que puede inscrustarse en un documento HTML; es decir en una pgina Web, Cuando un Navegador carga una pagina Web que contiene un Applet, este se descarga en el navegador Web y comienza a ejecutarse esto nos permite crear programas que cualquier usuario puede ejecutar con tan solo cargar la pagina Web en su navegador. El Navegador que carga y ejecuta el applet se conoce en trminos genricos como el contenedor de Applets. Ventajas Un applet de Java puede tener alguna o todas de las siguientes ventajas: o Funcionan en Linux, Windows y Mac OS, son multiplataforma. o El mismo applet pueden trabajar en "todas" las versiones de Java, y no slo la ltima versin del plug-in. Sin embargo, si un applet requiere una versin posterior de la JRE, el cliente se ver obligado a esperar durante la gran descarga. o Es soportado por la mayora de los navegadores Web. o Puede ser almacenado en la memoria cache de la mayora de los navegadores Web, de modo que se cargar rpidamente cuando se vuelva a cargar la pgina Web, aunque puede quedar atascado en la cach, causando problemas cuando se liberan nuevas versiones. o Puede tener acceso completo a la mquina en la que se est ejecutando, si el usuario lo permite o Puede ejecutarse con velocidades comparables (pero en general ms lento) a la de otros lenguajes compilados, como C + +, pero muchas veces ms rpida que la de JavaScript o Puede trasladar el trabajo del servidor al cliente, haciendo una solucin Web ms escalable tomando en cuenta el nmero de usuarios / clientes. Desventajas: Un applet de Java puede presentar cualquiera de las siguientes desventajas: o Requiere el plug-in de Java, que no est disponible por defecto en todos los navegadores web. o Sun no ha creado una implementacin del plug-in para los procesadores de 64 bits o No puede iniciar la ejecucin hasta que la Mquina virtual de Java est en funcionamiento, y esto puede tomar tiempo la primera vez que se ejecuta un applet. o Si no est firmado como confiable, tiene un acceso limitado al sistema del usuario - en particular no tiene acceso directo al disco duro del cliente o al portapapeles. o Algunas organizaciones slo permiten la instalacin de software a los administradores. Como resultado, muchos usuarios (sin privilegios para instalar el plug-in en su navegador) no pueden ver los applets. o Un Applet podra exigir una versin especfica del JRE. Ejemplos Incluidos en el JDK de Sun o Applet TicTacToe. o Applet DrawTest. o Applet BarChart. o Applet Animator. o Applet ArcTest. o Applet Blink. o Applet Clock. o Applet GraphicsTest. o Applet ImageMap. o Applet MoleculeViewer. o Applet JumpingBox.
Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

e. JAVA RUNTIME ENVIRONMENT JRE es el acrnimo de Java Runtime Environment (entorno en tiempo de ejecucin Java) y se corresponde con un conjunto de utilidades que permite la ejecucin de programas java sobre todas las plataformas soportadas. El JRE est constituido por una JVM (mquina virtual Java) que es el programa que interpreta el cdigo Java y adems por las libreras de clases estndar que implementan el API de Java. Ambas JVM y API deben ser consistentes entre s, de ah que sean distribuidas de forma conjunta. Un usuario slo necesita el JRE para ejecutar las aplicaciones desarrolladas en lenguaje Java, mientras que para desarrollar nuevas aplicaciones en dicho lenguaje es necesario un entorno de desarrollo, denominado JDK, que adems del JRE (mnimo imprescindible) incluye, entre otros, un compilador para Java. f. PLATAFORMA JAVA La plataforma Java es el nombre de un entorno o plataforma de computacin originaria de Sun Microsystems, capaz de ejecutar aplicaciones desarrolladas usando el Lenguaje de programacin Java u otros lenguajes que compilen a bytecode y un conjunto de herramientas de desarrollo. En este caso, la plataforma no es un hardware especfico o un sistema operativo, sino ms bien una mquina virtual encargada de la ejecucin de aplicaciones, y un conjunto de libreras estndar que ofrecen funcionalidad comn. La plataforma es as llamada la Plataforma Java (antes conocida como Plataforma Java 2), e incluye: o Plataforma Java, Edicin Estndar (Java Platform, Standard Edition), o Java SE (antes J2SE) o Plataforma Java, Edicin Empresa (Java Platform, Enterprise Edition), o Java EE (antes J2EE) o Plataforma Java, Edicin Micro (Java Platform, Micro Edition), o Java ME (antes J2ME) Tecnologas Java La Plataforma Java se compone de un amplio abanico de tecnologas, cada una de las cuales ofrece una parte del complejo de desarrollo o del entorno de ejecucin en tiempo real. Por ejemplo, los usuarios finales suelen interactuar con la mquina virtual de Java y el conjunto estndar de bibliotecas. Adems, las aplicaciones Java pueden usarse de forma variada, como por ejemplo ser incrustadas en una pgina Web. Para el desarrollo de aplicaciones, se utiliza un conjunto de herramientas conocidas como JDK (Java Development Kit, o herramientas de desarrollo para Java). Java Runtime Environment Un programa destinado a la Plataforma Java necesita dos componentes en el sistema donde se va a ejecutar: una mquina virtual de Java (JVM), y un conjunto de libreras para proporcionar los servicios que pueda necesitar la aplicacin. La JVM que proporciona Sun Microsystems, junto con su implementacin de las libreras estndar, se conocen como Java Runtime Environment (JRE) o Entorno en tiempo de ejecucin para Java. El JRE es lo mnimo que debe contener un sistema para poder ejecutar una aplicacin Java sobre el mismo. o Mquina Virtual de Java: El corazn de la Plataforma Java es el concepto comn de un procesador virtual que ejecuta programas escritos en el lenguaje de programacin Java. En concreto, ejecuta el cdigo resultante de la compilacin del cdigo fuente, conocido como bytecode

Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

Este procesador es la mquina virtual de Java o JVM (Java Virtual Machine ), que se encarga de traducir (interpretar o compilar al vuelo) el bytecode en instrucciones nativas de la plataforma destino. Esto permite que una misma aplicacin Java pueda ser ejecutada en una gran variedad de sistemas con arquitecturas distintas, siempre que con una implementacin adecuada de la JVM. Este hecho es lo que ha dado lugar a la famosa frase: write once, run anywhere (escribir una vez, ejecutar en cualquier parte). La condicin es que no se utilicen llamadas nativas o funciones especificas de una plataforma y an as no se asegura completamente que se cumpla una verdadera independencia de plataforma. Desde la versin 1.2 de JRE, la implementacin de la mquina virtual de Sun incluye un compilador JIT (Just In Time). De esta forma, en vez de la tradicional interpretacin del cdigo bytecode, que da lugar a una ejecucin lenta de las aplicaciones, el JIT convierte el bytecode a cdigo nativo de la plataforma destino. Esta segunda compilacin del cdigo penaliza en cuanto a tiempo, pero el cdigo nativo resultante se ejecuta de forma ms eficaz y rpida que si fuera interpretado. Otras tcnicas de compilacin dinmica del cdigo durante el tiempo de ejecucin permiten optimizar ms an el cdigo, dejando atrs la losa que sobre Java caa en cuanto a su lentitud y en sus ltimas versiones la JVM se ha optimizado a tal punto que ya no se considera una plataforma lenta en cuanto a ejecucin de aplicaciones. o Libreras de Java Las libreras de Java tienen tres propsitos dentro de la Plataforma Java. Al igual que otras libreras estndar, ofrecen al programador un conjunto bien definido de funciones para realizar tareas comunes, como manejar listas de elementos u operar de forma sofisticada sobre cadenas de caracteres. Adems, las libreras proporcionan una interfaz abstracta para tareas que son altamente dependientes del hardware de la plataforma destino y de su sistema operativo. Tareas tales como manejo de las funciones de red o acceso a ficheros, suelen depender fuertemente de la funcionalidad nativa de la plataforma destino. En el caso concreto anterior, las libreras java.net y java.io implementan el cdigo nativo internamente, y ofrecen una interfaz estndar para que aplicaciones Java puedan ejecutar tales funciones. Finalmente, no todas las plataformas soportan todas las funciones que una aplicacin Java espera. En estos casos, las libreras bien pueden emular esas funciones usando lo que est disponible, o bien ofrecer un mecanismo para comprobar si una funcionalidad concreta est presente. o Lenguajes: La palabra Java, por s misma, se refiere habitualmente al lenguaje de programacin Java, que fue diseado para usar con la Plataforma Java. Los lenguajes de programacin se encuentran fuera del mbito de lo que es una plataforma, aunque el lenguaje de programacin Java es uno de los componentes fundamentales de la plataforma Java. El propio lenguaje y el entorno en tiempo de ejecucin suelen considerarse una nica entidad. IDEs : (Integrated Development Environments) Es un programa informtico compuesto por un conjunto de herramientas de programacin. Un IDE es un entorno de programacin que ha sido empaquetado como un programa de aplicacin, es decir, consiste en un editor de cdigo, un compilador, un depurador y un constructor de interfaz grfica (GUI). Los IDEs pueden ser aplicaciones por s solas o pueden ser parte de aplicaciones existentes. Es posible que un mismo IDE pueda funcionar con varios lenguajes de programacin. Este es el caso de Eclipse, al que mediante plugins se le puede aadir soporte de lenguajes adicionales.

Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

Componentes: o o o o o o o Un editor de texto. Un compilador. Un intrprete. Herramientas de automatizacin. Un depurador. Posibilidad de ofrecer un sistema de control de versiones. Factibilidad para ayudar en la construccin de interfaces grficas de usuario.

Soporte del Lenguaje: Algunos IDEs soportan mltiples lenguajes, tales como Eclipse o NetBeans, ambas basadas en Java o MonoDevelop, basado en C#. El soporte para lenguajes alternativos es a menudo proporcionada por plugins, que les permite ser instalado en el mismo IDE al mismo tiempo. Por ejemplo, Eclipse y NetBeans tiene plugins para C / C ++ , Ada , Perl , Python , Ruby y PHP, entre otros lenguajes. TRABAJO INDIVIDUAL A continuacin se entrega una lista de IDEs basados en JAVA, el cual cada estudiante deber investigar 10 de ellos en orden alfabtico. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Applet Designer Professional Apptivity Awesume Jawa BlueJ Bluette Bongo Clarion Internet Edition CodeWarrior Cosmo Code DrJava EasyEclipse Eclipse ED for Windows Elixir Free Builder Gel GRASP Grinder Hyperwire Jamba Animator Jamba JavaMan Java Studio Javelin JaWiz JBuilder JCreator JDesigner 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. JDE for Emacs JDeveloper JADI JIG Jipe JPad Kalimantan KAWA Lava Lemur NetBeans OEW PARTS for Java PowerJ Rational Roaster SNiFF+ Spirit SuperCede Visaj Vision Jade VisualAge for Java Visual Caf Visual J++ Web Application Platform Java WebIDE WipeOut

Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

II. PROGRAMACIN CONCURRENTE Se conoce por programacin concurrente a la rama de la informtica que trata de las notaciones y tcnicas de programacin que se usan para expresar el paralelismo potencial entre tareas y para resolver los problemas de comunicacin y sincronizacin entre procesos. En la programacin concurrente se supone que hay un procesador utilizable por cada tarea; no se hace ninguna suposicin de si el procesador ser una unidad independiente para cada uno de ellos o si ser una sola CPU que se comparte en el tiempo entre las tareas. Independientemente de cmo se vaya a ejecutar realmente el programa, en un sistema uniprocesador o multiprocesador, el resultado debe ser el correcto. Por ello, se supone que existe un conjunto de instrucciones primitivas que son o bien parte del S.O. o bien parte de un lenguaje de programacin, y cuya correcta implementacin y correccin est garantizada por el sistema. a. Java: Cuando se escribe un programa, en la mayora de los lenguajes de programacin, es necesario decidir el procesador y sistema operativo en los que se va a ejecutar, porque estos lenguajes incluyen llamadas a funciones especficas de una biblioteca asociada al sistema operativo de la plataforma destino. Cuando se est preparado para probar el programa, se enva el cdigo fuente a un compilador que lo transforma en un conjunto de instrucciones propias de la plataforma destino. Por ejemplo, Windows se ejecuta generalmente en un procesador Intel, como un Pentiunm, mientras que los Macintosh utilizan procesadores Motorola 68000 o PowerPC. Cuando se escribe en Java, no necesitamos pensar en llamadas a Windows, Mac OS, u otras bibliotecas del sistema operativo. Java tiene sus propias bibliotecas, llamadas paquetes, que son independientes de la plataforma. Por ello no es necesario preocuparse si la aplicacin se va a ejecutar en una plataforma Intel, una PowerPC o una SPARC. El compilador de Java no genera instrucciones nativas, en su lugar genera los llamados "cdigo de byte" (byte code) para la Mquina Virtual Java (Java Virtual Machine o JVM), que es una mquina que no existe fsicamente. Sun Microsystems (creadores de Java) y otras empresas han desarrollado versiones software de la JVM para una gran parte de las plataformas existentes en el mercado, es decir cada plataforma tiene su propia mquina virtual de Java, y es sta la que ejecuta los byte code. En Java podemos distinguir dos tipos de programas, las aplicaciones autosuficientes que son conocidas como aplicaciones y los que se ejecutan con la ayuda de otro programa (un navegador Web), que se conocen como applets. Las caractersticas principales que nos ofrece Java respecto a cualquier otro lenguaje de programacin son: Java es simple: Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las caractersticas menos usadas y ms confusas de stos. C++ es un lenguaje que adolece de falta de seguridad, pero C y C++ son lenguajes ms difundidos, por ello Java se dise para ser parecido a C++ y as facilitar un rpido y fcil aprendizaje. Java elimina muchas de las caractersticas de otros lenguajes como C++, para mantener reducidas las especificaciones del lenguaje y aadir caractersticas muy tiles como el garbage collector (recolector de memoria dinmica). No es necesario preocuparse de liberar memoria, el recolector se encarga de ello y como es un thread (hilo de ejecucin) de baja prioridad, cuando entra en accin, permite liberar bloques de memoria muy grandes, lo que reduce la fragmentacin de la memoria. Java reduce en un 50% los errores ms comunes de programacin con lenguajes como C y C++ al eliminar muchas de las caractersticas de stos, entre las que destacan:

Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

o o o o

aritmtica de punteros no existen referencias registros (struct) definicin de tipos (typedef)

Java es orientado a objetos: Java implementa la tecnologa bsica de C++ con algunas mejoras y elimina algunas cosas para mantener el objetivo de la simplicidad del lenguaje. Java trabaja con sus datos como objetos. Soporta las tres caractersticas propias del paradigma de la orientacin a objetos: encapsulacin, herencia y polimorfismo. Las plantillas de objetos son llamadas, como en C++, clases y sus copias, instancias. Estas instancias, como en C++, necesitan ser construidas y destruidas en espacios de memoria. Java es distribuido: Java se ha construido con extensas capacidades de interconexin TCP/IP. Existen libreras de rutinas para acceder e interactuar con protocolos como http y ftp. Esto permite a los programadores acceder a la informacin a travs de la red con tanta facilidad como a los ficheros locales. La verdad es que Java en s no es distribuido, sino que proporciona las libreras y herramientas para que los programas puedan ser distribuidos, es decir, que se ejecuten en vanas mquinas, interactuando. Java es multiplataforma: Para establecer Java como parte integral de la red, el compilador Java compila su cdigo a un fichero objeto de formato independiente de la arquitectura de la mquina en que se ejecutar. Cualquier mquina que tenga el sistema de ejecucin (run-time) puede ejecutar ese cdigo objeto, sin importar en modo alguno la mquina en que ha sido generado. Actualmente existen sistemas run time para Solaras 2.x, SunOs 4.1.x, Windows 95/98, Windows NT, Linux, Irix, Aix, Mac, Apple y probablemente haya grupos de desarrollo trabajando en el paso a otras plataformas. El cdigo fuente Java se "compila" a un cdigo de bytes de bajo nivel independiente de la mquina. Este cdigo (byte code) est diseado para ejecutarse en una mquina hipottica que es implementada por un sistema run-time, que s es dependiente de la mquina. Java es robusto: Java realiza verificaciones en busca de problemas tanto en tiempo de compilacin como en tiempo de ejecucin. La comprobacin de tipos en Java ayuda a detectar errores, lo antes posible, en el ciclo de desarrollo. Java obliga a la declaracin explcita de mtodos, reduciendo as las posibilidades de error. Maneja la memoria para eliminar las preocupaciones por parte del programador de la liberacin o corrupcin de memoria. Tambin implementa los arrays autnticos, en vez de listas enlazadas de punteros, con comprobacin de lmites, para evitar la posibilidad de sobreescribir o corromper memoria resultado de punteros que sealan a zonas equivocadas. Estas caractersticas reducen drsticamente el tiempo de desarrollo de aplicaciones en Java. Java es seguro: La seguridad en Java tiene dos facetas. En el lenguaje, caractersticas como los punteros o el casting implcito que hacen los compiladores de C y C++ se eliminan para prevenir el acceso ilegal a la memoria. Otra laguna de seguridad u otro tipo de ataque, es el Caballo de Troya. Se presenta un programa como una utilidad, resultando tener una funcionalidad destructiva. El cdigo Java pasa muchos tests antes de ejecutarse en una mquina. El cdigo se pasa a travs de un verificador de byte codes que comprueba el formato de los fragmentos de cdigo y aplica un probador de teoremas para detectar fragmentas de cdigo ilegal, cdigo que falsea punteros, viola derechos de acceso sobre objetos o intenta cambiar el tipo o clase de un objeto. Si los byte codes pasan la verificacin sin
Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

generar ningn mensaje de error, entonces sabemos que: El cdigo no produce desbordamiento de operandos en la pila. o o o o El tipo de los parmetros de todos los cdigos de operacin son conocidos y correctos. No ha ocurrido ninguna conversin ilegal de datos, tal como convertir enteros en punteros. El acceso a los campos de un objeto se sabe que es legal. No hay ningn intento de violar las reglas de acceso y seguridad establecidas

El Cargador de Clases tambin ayuda a Java a mantener su seguridad, separando el espacio de nombres del sistema de ficheros local, del de los recursos procedentes de la red. Esto limita cualquier aplicacin del tipo Caballo de Troya, ya que las clases se buscan primero entre las locales y luego entre las procedentes del exterior. Las clases importadas de la red se almacenan en un espacio de nombres privado, asociado con el origen. Cuando una clase del espacio de nombres privado accede a otra clase, primero se busca en las clases predefinidas (del sistema local) y luego en el espacio de nombres de la clase que hace la referencia. Esto imposibilita que una clase suplante a una predefinida. En resumen, las aplicaciones de Java resultan extremadamente seguras, ya que no acceden a zonas delicadas de memoria o de sistema, con lo cual evitan la interaccin de ciertos virus. Java no posee una semntica especfica para modificar la pila de programa, la memoria libre o utilizar objetos y mtodos de un programa sin los privilegios del ncleo del sistema operativo. Adems, para evitar modificaciones por parte de los crackers de la red, implementa un mtodo seguro de autentificacin por clave pblica. El Cargador de clases puede verificar una firma digital antes de realizar una instancia de un objeto. Por tanto, ningn objeto se crea y almacena en memoria, sin que se validen los privilegios de acceso. Es decir, la seguridad se integra en el momento de compilacin, con el nivel de detalle y de privilegio que sea necesario. Dada, pues la concepcin del lenguaje y si todos los elementos se mantienen dentro del estndar marcado por Sun, no hay peligro. Java imposibilita, tambin, abrir ningn fichero de la mquina local (siempre que se realizan operaciones con archivos, stas trabajan sobre el disco duro de la mquina de donde parti el applet), no permite ejecutar ninguna aplicacin nativa de _una plataforma (desde un applet) e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar nuestra mquina para hacer peticiones o realizar operaciones con otraAdems, los intrpretes que incorporan los navegadores de la Web son an ms restrictivos. Java es interpretado: El intrprete Java puede ejecutar directamente el cdigo objeto. Enlazar (linkar) un programa, normalmente, consume menos recursos que compilarlo, por lo que los desarrolladores con Java pasarn ms tiempo desarrollando y menos esperando. No obstante, el compilador actual del JDK (Java Development Kit) es bastante lento. Por ahora, que todava no hay compiladores especficos de Java para las diversas plataformas, Java es ms lento que otros lenguajes de programacin, como C++, ya que debe ser interpretado y no ejecutado como sucede en cualquier programa tradicional. Se dice que Java es de 10 a 30 veces ms lento que C, y que tampoco existen en Java proyectos de gran envergadura como en otros lenguajes. Lo que hay que dejar claro en todo esto, es que primero habra que decidir hasta que punto Java, un lenguaje en pleno desarrollo y todava sin definicin definitiva, est maduro corno lenguaje de programacin para ser comparado con otros; como por ejemplo con Smalltalk, que lleva ms de 20 aos. La verdad es que Java para conseguir ser un lenguaje independiente del sistema operativo y del procesador que incorpore la mquina utilizada, es tanto interpretado como compilado. Y esto no es ningn contrasentido, el cdigo fuente escrito con cualquier editor se compila generando el byte code. Este cdigo intermedio es de muy bajo nivel, pero sin alcanzar las instrucciones mquina, propias de cada plataforma. El byte code corresponde al 80% de las instrucciones de la aplicacin. Ese mismo
Lenguaje de Programacin V

10

Ing. Einar TURPO AROQUIPA

cdigo es el que se puede ejecutar sobre cualquier plataforma. Para ello hace falta el run time, que s es completamente dependiente de la mquina y del sistema operativo, que interpreta dinmicamente el byte code y aade el 20% de instrucciones que faltaban para su ejecucin. Con este sistema es fcil crear aplicaciones multiplataforma, pero para ejecutarlas es necesario que exista el run time correspondiente al sistema operativo utilizado. Java es multithreaded: Al ser multithreaded (multi-hilo), Java permite muchas actividades simultneas en un programa. Los threads, son bsicamente pequeos procesos o piezas independientes de un gran proceso. Al estar los threads incluidos en el lenguaje, son ms fciles de usar y ms robustos que las sus implementaciones en C o C++. El beneficio de ser miltithreaded consiste en un mejor rendimiento interactivo y mejor comportamiento en tiempo real. Aunque el comportamiento en tiempo real est limitado a las capacidades del sistema operativo sobre el que corre, an supera a los entomos de flujo nico de programa (single-threaded) tanto en facilidad de desarrollo como en rendimiento. A continuacin profundizaremos un poco ms en el concepto de threads. b. Hilos: El multihilo soportado en Java gira alrededor del concepto de hilo. La cuestin es, qu es un hilo? De forma sencilla, un hilo es un nico flujo de ejecucin dentro de un proceso. Pero ser mejor comenzar desde el principio, un proceso es un programa ejecutndose dentro de su propio espacio de direcciones. lava es un sistema multiproceso, esto significa que soporta varios procesos corriendo a la vez dentro de sus propios espacios de direcciones. Estamos ms familiarizados con el trmino multitarea, el cual describe un escenario muy similar al multiproceso. Por ejemplo, consideremos la cantidad de aplicaciones que corren a la vez dentro de un mismo entorno grfico. Mientras escribo esto, est corriendo Microsoft Word adems de Internet Explorer, Windows Explorer, CD Player y el Volumen Control. Estas aplicaciones son todas procesos ejecutados dentro de Windows 98. De esta forma, se puede pensar que los procesos son anlogos a las aplicaciones o a programas aislados, pero cada proceso tiene asignado espacio propio de ejecucin dentro del sistema. Un hilo es una secuencia de cdigo en ejecucin dentro del contexto de un proceso. Los hilos no pueden ejecutarse ellos solos; requieren la supervisin de un proceso padre para correr. Dentro de cada proceso hay varios hilos ejecutndose. Por ejemplo, Word puede tener un hilo en background chequeando automticamente la gramtica de lo que estoy escribiendo, mientras otro hilo puede estar salvando automticamente los cambios del documento en el que estoy trabajando. Como Word, cada aplicacin (proceso) puede correr varios hilos los cuales estn realizando diferentes tareas. Esto significa que los hilos estn siempre asociados con un proceso en particular. Los hilos a menudo son conocidos o llamados procesos ligeros. Un hilo, en efecto, es muy similar a un proceso pero con la diferencia de que un hilo siempre corre dentro del contexto de otro programa. Por el contrario, los procesos mantienen su propio espacio de direcciones y entorno de operaciones. Los hilos dependen de un programa padre en lo que se refiere a recursos de ejecucin. Java es un lenguaje de programacin que incorpora hilos en el corazn del mismo lenguaje. Comnmente, los hilos son implementados a nivel de sistema, requiriendo una interfaz de programacin especfica separada del ncleo del lenguaje de programacin. Esto es lo que ocurre con CIC++ programando en Windows, porque se necesita usar la interfaz de programacin Win32 para desarrollar aplicaciones Windows multihilo.

Lenguaje de Programacin V

11

Ing. Einar TURPO AROQUIPA

Java se presenta como ambos, como lenguaje y como sistema de tiempo de ejecucin (runtime), siendo posible integrar hilos dentro de ambos. El resultado final es que se pueden usar hilos Java como standard, en cualquier plataforma. Clases Relacionadas con los Hilos: El lenguaje de programacin Java proporciona soporte para hilos a travs de una simple interfaz y un conjunto de clases. La interfaz de Java y las clases que incluyen funcionalidades sobre hilos son las siguientes: o Thread o Runnable o Object Thread Thread: La clase Thread es la clase responsable de producir hilos funcionales para otras clases. Para aadir la funcionalidad de hilo a una clase simplemente se deriva la clase de Thread y se ignora el mtodo run. Es en este mtodo run donde el procesamiento de un hilo toma lugar, ya menudo se refieren a l como el cuerpo del hilo. La clase Thread tambin define los mtodos start y stop, los cuales te permiten comenzar y parar la ejecucin del hilo, adems de un gran nmero de mtodos tiles. Runnable: Java no soporta herencia mltiple de forma directa, es decir, no se puede derivar una clase de varias clases padre. Esto nos plantea la duda sobre cmo podemos aadir la funcionalidad de Hilo a una clase que deriva de otra clase, siendo sta distinta de Thread. Para lograr esto se utiliza la interfaz- Runnable. La interfaz Runnable proporciona la capacidad de aadir la funcionalidad de un hilo a una clase simplemente implementando la interfaz, en lugar de derivndola de la clase Thread. Las clases que implementan la interfaz Runnable proporcionan un mtodo run que es ejecutado por un objeto hilo asociado que es creado aparte. Esta es una herramienta muy til y a menudo es la nica salida que tenemos para incorporar multihilo dentro de las clases. Esta cuestin ser tratada ms ampliamente en el apartado de Creacin de hilos. Object: Aunque, estrictamente hablando, no es una clase de apoyo a los hilos, la clase objeto proporciona unos cuantos mtodos cruciales dentro de la arquitectura multihilo de Java. Estos mtodos son wait, notify y notifyAll. El mtodo wait hace que el hilo de ejecucin espere en estado dormido hasta que se le notifique que contine. Del mismo modo, el mtodo notify informa a un hilo en espera de que contine con su ejecucin. El mtodo notifyAll es similar a notify excepto que se aplica a todos los hilos en espera. Estos tres mtodos solo pueden ser llamados desde un mtodo o bloque sincronizado (o bloque de sincronizacin). c. Creacin de Hilos: En Java, los hilos comparten el mismo espacio de memoria. Incluso comparten gran parte del entorno de ejecucin, de modo que la creacin de nuevos hilos es mucho ms rpida que la creacin de nuevos procesos. La ventaja que proporcionan los hilos es la capacidad de tener ms de un camino de ejecucin en un mismo programa. As, con un nico proceso, ejecutndose una JVM (Java Virtual Machine), habr siempre ms de un hilo, cada uno con su propio camino de ejecucin. En cuanto al proceso de creacin de hilos, son dos los mecanismos que nos permiten llevarlo a cabo en Java: implementando la interfaz Runnable, o extendiendo la clase Thread, esto es, creando una subclase de esta clase. 12

Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

En ambos casos, se deber definir un mtodo run que ser el incluya las instrucciones que se ejecutarn en el thread y se pueden definir prioridades aunque no se puede confiar en que la maquina virtual escoja para ejecutar, siempre, el de mayor prioridad por lo que no se pueden utilizar para basar en ellas el scheduler en un sistema de tiempo real. Creacin de un hilo: la Clase Thread --------------------------------------------------------------------------------------------------------public class ThreadEjemplo extends Thread { public ThreadEjemplo(String str) { super(str); } public void run() { for (int i = 0; i < 10 ; i++) System.out.println(i + " " + getName()); System.out.println("Termina thread " + getName()); } public static void main (String [] args) { new ThreadEjemplo("Pepe").start(); new ThreadEjemplo("Juan").start(); System.out.println("Termina thread main"); } } --------------------------------------------------------------------------------------------------------Compila y ejecuta el programa. La salida, ser algo as: Termina thread main 0 Pepe 1 Pepe 2 Pepe 3 Pepe 0 Juan 4 Pepe 1 Juan 5 Pepe 2 Juan 6 Pepe 3 Juan 7 Pepe 4 Juan 8 Pepe 5 Juan 9 Pepe 6 Juan Termina thread Pepe 7 Juan 8 Juan 9 Juan Termina thread Juan
Lenguaje de Programacin V

13

Ing. Einar TURPO AROQUIPA

Ejecuta varias veces el programa. Vers que no siempre se ejecuta igual. Notas sobre el programa: o La clase Thread est en el package java.lang. Por tanto no es necesario el import. o El constructor public Thread(String str) recibie un parmetro que es la identificacin del Thread. o El mtodo run contiene el bloque de ejecucin del Thread. Dentro de l, el mtodo getName() devuelve el nombre del Thread (el que se ha pasado como argumento al constructor). o El mtodo main crea dos objetos de clase ThreadEjemplo y los inicia con la llamada al mtodo start(). (el cual inicia el nuevo thread y llama al mtodo run() ). o Observa en la salida el primer mensaje, de finalizacin del thread main. La ejecucin de los threads es asncrona. Realiza la llamada al mtodo start(), ste le devuelve control y continua su ejecucin, independiente de los otros threads. o En la salida los mensajes de un thread y otro se van mezclando. La mquina virtual asigna tiempos a cada thread. Creacin de un hilo: la Interfaz Runnable -----------------------------------------------------------------------------------------------------------------public class ThreadEjemplo implements Runnable { public void run() { for (int i = 0; i < 5 ; i++) System.out.println(i + " " + Thread.currentThread().getName()); System.out.println("Termina thread " + Thread.currentThread().getName()); } public static void main (String [] args) { new Thread ( new ThreadEjemplo() , "Pepe").start(); new Thread ( new ThreadEjemplo() , "Juan").start(); System.out.println("Termina thread main"); }

} -----------------------------------------------------------------------------------------------------------------Obsrvese en este caso: o o o Se implanta la interface Runnable en lugar de extender la clase Thread. El constructor que haba antes no es necesario. En el main observa la forma en que se crea el thread. Esa expresin es equivalente a: ThreadEjemplo ejemplo = new ThreadEjemplo(); Thread thread = new Thread ( ejemplo , "Pepe"); thread.start(); o Primero se crea la instancia de nuestra clase. o Despus se crea una instancia de la clase Thread, pasando como parmetros la referencia de nuestro objeto y el nombre del nuevo thread. o Por ltimo se llama al mtodo start de la clase thread. Este mtodo iniciar el nuevo thread y llamar al mtodo run() de nuestra clase.

Lenguaje de Programacin V

14

Ing. Einar TURPO AROQUIPA

Por tlimo, obsrvese la llamada al mtodo getName() desde run(). getName es un mtodo de la clase Thread, por lo que nuestra clase debe obtener una referencia al thread propio. Es lo que hace el mtodo esttico currentThread() de la clase Thread.

d. Ciclo de vida de un Hilo: En cualquier momento, se dice que un hilo esta en uno de varios estados de hilos (que se ilustran en la figura mostrada). Supongamos que un hilo se acaba de crear, est en el estado nacido. El hilo permanece en ese estado hasta que se invoca el mtodo start del hilo; esto hace que el hilo pase al estado listo. El hilo listo de ms alta prioridad pasa al estado en ejecucin cuando el sistema asigna un procesador al hilo (esto es, el hilo inicia su ejecucin). Un hilo pasa al estado muerto cuando termina su mtodo run o cuando se invoca su mtodo stop; en algn momento, el sistema dispondr del hilo muerto. Un hilo en ejecucin pasa al estado bloqueado cuando el hilo emite una solicitud de entrada / salida. Un hilo bloqueado queda listo cuando la entrada / salida que estaba esperando termina. Un hilo bloqueado no puede usar un procesador aunque haya uno disponible.

nacido start

listo Despachar (asignar un procesador) en ejecucin

expiracin de cuanto

en espera

dormido

suspendido

bloqueado

Expira el intervalo de sueo

Stop

completar

resume

muerto

Lenguaje de Programacin V

15

Ing. Einar TURPO AROQUIPA

e. Prioridad y Planificacin de Hilos: Toda applet o aplicacin JAVA es multihilos. Todo hilo JAVA tiene una prioridad en el intervalo de Thread.MIN_PRIORITY (una constante que vale 1) a Thread.MAX_PRIORITY (una constante que vale 10). Por omisin, a todos los hilos se les asigna la prioridad normal Thread. NORM_PRIORITY (una constante que vale 5). Todo hilo nuevo hereda la prioridad del hilo que lo cre. Algunas plataformas de lava manejan un concepto llamado tajadas de tiempo; otras no lo hacen. Sin tajadas de tiempo, cada hilo de un conjunto de hilos con la misma prioridad se ejecuta hasta terminar antes de que los "iguales" de ese hilo tengan oportunidad de ejecutarse. Con las tajadas de tiempo, cada hilo recibe un lapso breve de tiempo de procesador llamado cuanto, durante el cual ese hilo puede ejecutarse. Al expirar el cuanto, sea que el hilo haya completado su ejecucin o no, se le quitar el procesador a ese hilo y se le dar al siguiente hilo con la misma prioridad si hay uno listo. La tarea del planificador de lava es mantener un hilo de mxima prioridad ejecutndose en todo momento y, si se cuenta con tajadas de tiempo, asegurarse de que varios hilos con la misma prioridad se ejecuten, cada uno durante un cuanto, siguiendo un turno circular (es decir, por tajadas de tiempo). En la figura que se muestra, se ilustra la cola de prioridad multinivel de Java para los hilos, En la figura, los hilos A Y B se ejecutan, cada uno durante un cuanto, por turno circular hasta que ambos terminan su ejecucin. A continuacin, el hilo C se ejecuta hasta terminar. Luego, los hilos D, E y F se ejecutan, cada uno durante un cuanto, por turno circular hasta que todos terminan su ejecucin. Este proceso contina hasta que todos los hilos terminan de ejecutarse. Cabe sealar que la aparicin de nuevos hilos de alta prioridad podra posponer --- tal vez indefinidamente --- la ejecucin de los hilos de baja prioridad. Este aplazamiento indefinido tambin se conoce con el nombre ms sugestivo de inanicin. La prioridad de un hilo puede ajustarse con el mtodo setPriority, que recibe un argumento int. Si el argumento no est en el intervalo de 1 a 10 inclusive, el mtodo setPriority lanzar una excepcin de argumento no permitido (IllegalArgumentExcepton). El mtodo getPriority devuelve la prioridad del hilo.

Prioridad 10 Prioridad 9 Prioridad 8 Prioridad 7 Prioridad 6 Prioridad 5 Prioridad 4 Prioridad 3 Prioridad 2 Prioridad 1

A C

G H I

Lenguaje de Programacin V

16

Ing. Einar TURPO AROQUIPA

Un hilo puede llamar al mtodo yield (ceder el paso) para dar a otros hilos oportunidad de ejecutarse, De hecho, siempre que un hilo de ms alta prioridad queda listo, el hilo actual es desalojado, as que un hilo no puede ceder el paso a un hilo de ms alta prioridad porque ya habr sido desalojado en el momento en que el hilo de ms alta prioridad qued listo. Por lo mismo, yield siempre permite que se ejecute el hilo listo con ms alta prioridad, y si los nicos hilos que estn listos tienen ms baja prioridad que el hilo actual, ste ser el hilo con la ms alta prioridad y seguir ejecutndose. Por tanto, un hilo usa yield slo para dar oportunidad de ejecutarse a hilos de la misma prioridad. En un sistema con tajadas de tiempo esto es innecesario porque los hilos con la misma prioridad se ejecutan por turno circular durante un cuanto cada uno (o hasta que pierden el procesador por alguna razn). As, yield resulta apropiado para sistemas sin tajadas de tiempo en los que un hilo normalmente se ejecuta hasta terminar antes de que otro hilo con la misma prioridad tenga oportunidad de ejecutarse. Un hilo se ejecuta hasta que muere, se bloquea para entrada / salida, llama a sleep, llama a yield o es desalojado por un hilo de mayor prioridad, o hasta que su cuanto expira. Un hilo con una prioridad ms alta que la del hilo actual puede quedar listo (y por tanto desalojar al hilo en ejecucin) si se reanuda un hilo suspendido, si un hilo dormido termina de dormir, si se completa la E/S que un hilo estaba esperando, o si se invoca notify o notifyAll para un hilo que invoc wait. La aplicacin del cdigo a mostrarse demuestra algunas tcnicas bsicas de manejo de hilos, incluida la creacin de una clase derivada de Thread, la construccinde un Thread y el empleo del mtodo sleep de la clase Thread. Cada hilo de ejecucin que creamos en el programa exhibe su nombre despus de dormir durante un tiempo aleatorio entre 0 y 5 segundos. El programa consiste en dos clases: PrintThread (imprimir hilo) y PrintTest(prueba de impresin). -----------------------------------------------------------------------------------------------------------------------------// PrintTest.java // Mostrar mltiples hilos imprimiendo a intervalos distintos. public class PrintTest { public static void main ( String args[] ) { PrintThread thread1, thread2, thread3, thread4; thread1 = new PrintThread( "1" ); thread2 = new PrintThread( "2" ); thread3 = new PrintThread( "3" ); thread4 = new PrintThread( "4" ); thread1.start(); thread2.start(); thread3.start(); thread4.start(); } }

class PrintThread extends Thread { int sleepTime; // El constructor PrintTbread asigna un nombre al hilo', ; // llamando al constructor Thread public PrintThread( String id ) { super (id); // dormir entre 0 y 5 segundos sleepTime = (int) ( Math.random() * 5000); System.out.println ("Nombre: " + getName() + "; dormir:" + sleepTime );
Lenguaje de Programacin V

17

Ing. Einar TURPO AROQUIPA

} // ejecutar el hilo public void run() { // poner el hilo a dormir durante un intervalo aleatorio try { sleep( sleepTime); } catch ( InterruptedException exception ) { System.err.println( "Excepcin: " + exception.toString() ); } // imPrimir el nombre del hilo System.out.println( "Hilo" + getName() );

} } -----------------------------------------------------------------------------------------------------------------------------La clase PrintThread --- que hereda de Thread --- consiste en la variable de ejemplar sleepTime (tiempo de sueo), un constructor y un mtodo run. La variable de ejemplar sleepTime almacena un valor entero aleatorio que se escoge cuando se construye un objeto printThread. Cada objeto PrintThread dormir durante el tiempo especificado por sleepTime y luego exhibir su nombre. El constructor PrintTbread recibe un argumento String que representa el nombre del hilo, e invoca el constructor Thread de la superclase con ese String. El constructor de la clase Thread usa l String para establecer el nombre del hilo. A continuacin, el constructor PrintThread inicializa sleepTime asignndole un entero aleatorio entre 0 y 5000 (0 a 5 segundos), Luego se exhibe el nombre y el valor de sleepTime para mostrar Ios valores correspondientes al PrintThread especfico que se est construyendo. Cuando se invoca el mtodo start de un PrintThread (heredado de Thread), el objeto PrintThread pasa al estado listo, Cuando el sistema asigna un procesador al objeto PrintThread, ste pasa al estado en ejecucin y su mtodo run comienza a ejecutarse. El mtodo run invoca al mtodo sleep que de inmediato hace que el objeto pase al estado dormido. Cuando el objeto despierta, pasa otra vez al estado listo, en el que permanece hasta que se le asigna un procesador. Cuando el objeto printThread pasa otra vez al estado en ejecucin, exhibe su nombre. A continuacin, el mtodo run termina y el objeto PrintThread pasa al estado muerto. Observe que el mtodo sleep puede lanzar una excepcin de "interrumpido" (InterruptedException), por lo que se debe invocar dentro de un bloque try, o bien la excepcin debe declararse en la clusula throws del mtodo run. El mtodo main de la clase printTest ejemplariza cuatro objetos PrintThread e invoca el mtodo start de la clase Thread para cada uno a fin de colocarlos en el estado listo. f. Sincronizacin: Java usa monitores (analizados por C. A. R. Hoare en su artculo de 1974) para manejar la sincronizacin. Todo objeto con mtodos synchronized (sincronizado) es un monitor. El monitor slo permite a un hilo a la vez ejecutar un mtodo synchronized con el objeto. Esto se logra poniendo un candado al objeto cuando se invoca el mtodo synchronized. Si hay varios mtodos synchronized, slo uno de ellos podr estar activo con un objeto a la vez; todos los dems hilos que intenten invocar mtodos synchronized debern esperar. Cuando un mtodo synchronized termina de ejecutarse, se libera el candado del objeto y el monitor permite que el hilo listo con ms alta prioridad que est intentando invocar un mtodo synchronized proceda.

Lenguaje de Programacin V

18

Ing. Einar TURPO AROQUIPA

Un hilo ejecutndose en un mtodo synchronized podra determinar que no puede continuar, as que el hilo invoca wait voluntariamente. Esto hace que el hilo deje de competir por el procesador y por el objeto monitor. Ahora, el hilo esperar en una cola mientras otros hilos tratan de entrar en el objeto. Cuando un hilo que est ejecutando un mtodo synchronized termina, el objeto puede notificar (con notify) a un hilo en espera que vuelva a estar listo para que pueda intentar obtener otra vez el candado del objeto monitor y ejecutarse. El notify acta como una seal para el hilo en espera, indicndole que la condicin que estaba esperando ya se satisfizo, y que es aceptable que vuelva a entrar en el monitor. Si un hila invoca notifyAll, todos los hilos que estaban esperando el objeto se hacen elegibles para volver a entrar en el monitor (es decir, todos pasan al estado listo). Recuerde que slo uno de esos hilos puede obtener el candado del objeto a la vez. Los objetos monitor forman en cola todos los hilos que esperan entrar en el objeto para ejecutar mtodos synchronized. Un hilo se forma en cola y espera el objeto si ese hilo llama a un mtodo synchronized del objeto mientras otro hilo ya se est ejecutando en un mtodo synchronized de dicho objeto. Un hilo tambin se forma en cola si llama a wait mientras esta operando dentro del objeto. Sin embargo, es importante distinguir entre los hilos en espera que se bloquearon porque el monitor estaba ocupado y los hilos que explcitamente invocaron wait dentro del monitor. Al terminar un mtodo synchronized, los hilos externos que se bloquearon porque el monitor estaba ocupado pueden proceder a entrar en el objeto. Los hilos que explcitamente invocaron wait slo podrn continuar cuando se les notifique que pueden hacerlo (es decir, cuando otro hilo invoca notify o notifyAll), Cuando sea aceptable que un libro formado en cola contine, el planificador seleccionara el hilo que tenga la ms alta prioridad. -----------------------------------------------------------------------------------------------------------------------------import java.io.* ; public class escuela { public static void main ( String args[] ) { try { Nota laNota = new Nota (); Profesor p = new Profesor ( laNota ); Alumno a = new Alumno ( "Javier", laNota); Alumno b = new Alumno ( "Jose", laNota ); // Empezamos la ejecucin a.start(); b.start(); p.start(); a.join(); b.join(); p.join(); } catch ( Exception e ) { System.out.println ( e.toString() ); } } } class Alumno extends Thread { Nota na ; // nota del alumno String nom ; // nombre Alumno ( String nombre , Nota n ) {
Lenguaje de Programacin V

19

Ing. Einar TURPO AROQUIPA

na = n ; nom = nombre ;

public void run () { System.out.println ( nom + " Esperado su nota" ); na.esperar(); // el alumno espera la nota System.out.println ( nom + " recibio su nota"); }

class Profesor extends Thread { Nota na ; Profesor ( Nota n ) { na = n ; } public void run () { System.out.println ( "Voy a poner la nota "); na.dar (); // el profesor pone la nota del alumno }

class Nota { synchronized void esperar () { try { wait(); } catch (InterruptedException e ){} } synchronized void dar () { notifyAll(); } } -----------------------------------------------------------------------------------------------------------------------------TRABAJO INDIVIDUAL Desarrolle las siguientes preguntas. 1. Llene los espacios en blanco. a) C y C++ son lenguajes de un solo ________ en tanto que lava es un lenguaje ___________. b) Java proporciona un hilo ______________ que automticamente recupera la memoria que se asign dinmicamente. c) Java elimina la mayor parte de los errores de _____________ que ocurren comnmente en lenguajes como C y C++ cuando el programa no recupera explcitamente la memoria dinmica mente asignada. 20

Lenguaje de Programacin V

Ing. Einar TURPO AROQUIPA

d) El mtodo ____________ sirve para terminar la ejecucin de un Thread. e) Cuatro razones por las que un hilo podra no ser ejecutable (es decir, estar bloqueado) son ___________, _________, ______________ y __________. f) Dos razones por las que un hilo podra pasar al estado muerto son __________ y _________ . g) La prioridad de un hilo puede cambiarse con el mtodo ____________ . h) Un hilo puede ceder el procesador a otro hilo de la misma prioridad llamando al mtodo _______ i) Para esperar un nmero designado de milisegundos y luego reanudar su ejecucin, un hilo debe llamar al mtodo ______________. j) Un hilo __________ puede activarse otra vez llamado al mtodo resume. k) El mtodo ____________ coloca el primer hilo de la cola de espera del objeto en el estado listo. 2. Indique si las siguientes afirmaciones son verdaderas o falsas, En caso de que alguna sea Falsa, indique porqu. a) Un hilo no es ejecutable si est muerto. b) En Java, un hilo ejecutable de ms alta prioridad desaloja a los hilos de ms baja prioridad. c) Los sistemas Java para Windows y Windows NT usan tajadas de tiempo. Esto permite a los hilos desalojar a otros hilos de la misma prioridad. d) Los hilos pueden ceder el paso (con yield) a hilos de ms baja prioridad. 3. Indique si las siguientes afirmaciones son verdaderas o falsas. En caso de que alguna sea falsa, indique porque: a) El mtodo sleep no consume tiempo de procesador mientras un hilo duerme. b) Declarar un mtodo como synchronized garantiza que no podr ocurrir un bloqueo mortal. c) Java cuenta con una capacidad muy potente llamada herencia multiple. 4. Defina los siguientes trminos a) b) c) d) e) a) f) g) h) hilo multihilado estado listo estado bloqueado planificacin desalojadora interfaz Runnable monitor mtodo notify relacin productor/consumidor

5. Liste las razones para usar multihilos. 6. Liste las cuatro razones para entrar en un estado bloqueado. Para cada una, describa cmo el hilo normalmente saldr del estado bloqueado y pasar al estado ejecutable. 7. Cite la diferencia entre la planificacin desalojadora y la no desalojadora, Cul usa Java? 8. Qu son tajadas de tiempo? Cite una diferencia fundamental en la forma como se realiza la planificacin en los sistemas Java que manejan tajadas de tiempo y los que no lo hacen. 9. Por qu podra un hilo invocar alguna vez yield? 10. Qu aspectos del desarrollo de applets de Java para World Wide Web fomentan el uso abundante de yield y sleep por parte de los diseadores de applet?

Lenguaje de Programacin V

21

Ing. Einar TURPO AROQUIPA

11. Si un programador opta por escribir su propio mtodo start, qu no debe olvidar hacer para asegurarse de que sus hilos arranquen correctamente? 12. Distinga entre cada una de las siguientes formas de hacer que un hilo haga una pausa a) Espera ocupada b) Sueo c) Suspensin 13. Escriba un enunciado de Java que pruebe si un hilo esta vivo o no. 14. Analice cada uno de los siguientes trminos en el contexto de los monitores: a) monitor b) productor c) consumidor d) wait e) notify f) InterruptedException g) Synchronized 15. Simular la legendaria carrera de la liebre y la tortuga, coloque cada uno de los animales en su propio hilo. Al principio de la carrera invoque los mtodos start de cada uno de los hilos. Use wait, notify y notifyAll para sincronizar las actividades de los animales.

III. Programacin en red - SOCKETS TCP/IP

Lenguaje de Programacin V

22

Ing. Einar TURPO AROQUIPA

Vous aimerez peut-être aussi