Your SlideShare is downloading. ×
0
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
2o departamental Programacion 3
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

2o departamental Programacion 3

1,019

Published on

Apuntes basicos para la materia.

Apuntes basicos para la materia.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,019
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Threads en JavaProgramación Concurrente<br />M. En I.S.C. Leonardo Miguel Moreno Villalba<br />
  • 2. Que es un Proceso?<br />Un proceso es un programa ejecutándose dentro de su propio espacio de direcciones. Java es un sistema multiproceso, esto significa que soporta varios procesos corriendo a la vez dentro de sus propios espacios de direcciones.<br />
  • 3. Que es un Thread?<br />Los threads-traducidos como hilos, hebras o contextos de ejecución- son espacios de código que la JVM ejecutará de forma simultanea en una maquina multiprocesador y de forma conmutada en maquina de un solo procesador, este es, la ejecución de los threads se realizará asignando un determinado quantum o espacio de tiempo a cada uno de los threads.<br />
  • 4. Que es un thread?<br />Un hilo es una secuencia de código en ejecución dentro del contexto de un proceso. Los hilos no pueden ejecutarse ellos solos; requieren la supervisión de un proceso padre para correr.<br />
  • 5. Java en un Sistema multihilos?<br />La Máquina Virtual Java (JVM) es un sistema multihilo. Es decir, es capaz de ejecutar varios hilos de ejecución simultáneamente. <br />La JVM gestiona todos los detalles, asignación de tiempos de ejecución, prioridades, etc., de forma similar a como gestiona un Sistema Operativo múltiples procesos. <br />La diferencia básica entre un proceso de Sistema Operativo y un Thread Java es que los hilos corren dentro de la JVM, que es un proceso del Sistema Operativo y por tanto comparten todos los recursos, incluida la memoria y las variables y objetos allí definidos.<br />A este tipo de procesos donde se comparte los recursos se les llama a veces procesos ligeros (lightweightprocess).<br />
  • 6. Java Threads<br />Thread (hilo, tarea) es la clase base de Java para definir hilos de ejecución concurrentes dentro de un mismo programa.<br />En Java, como lenguaje O.O., el concepto de concurrencia está asociado a los objetos:<br />Son los objetos los que actúan concurrentemente con otros.<br />
  • 7. Java Threads<br /> Las clases de objetos (hilos) que puedan actuar concurrentemente deben extender la clase Thread.<br />Ejemplo:<br />classmiClaseConcurrenteextendsThread {...}<br />
  • 8. La Clase Thread<br />Las clases derivadas de Thread deben de incluir un método:<br />public void run ()<br />Este método especifica realmente la tarea a realizar.<br />La ejecución del método run de un Thread puede realizarse concurrentemente con otros métodos run de otros Thread y con el método main.<br />
  • 9. La Clase Thread<br />La forma más directa para hacer un programa multihilo es extender la clase Thread, y redefinir el método run(). Este método es invocado cuando se inicia el hilo (mediante una llamada al método start() de la clase Thread). El hilo se inicia con la llamada al método run() y termina cuando termina éste.<br />
  • 10. Ejemplo 1<br />public class ThreadEjemplo extends Thread {<br />publicThreadEjemplo(Stringstr) {<br />super(str);<br />}<br />publicvoidrun() {<br />for (int i = 0; i < 10 ; i++)<br />System.out.println(i + " " + getName());<br />System.out.println("Termina thread " + getName());<br />}<br />public static void main (String [] args) {<br />new ThreadEjemplo("Pepe").start();<br />new ThreadEjemplo("Juan").start();<br />System.out.println("Termina threadmain");<br />}<br />}<br />
  • 11. Salida del Código<br />0 Pepe<br />1 Pepe<br />2 Pepe<br />3 Pepe<br />0 Juan<br />4 Pepe<br />1 Juan<br />5 Pepe<br />2 Juan<br />6 Pepe<br />3 Juan<br />7 Pepe<br />4 Juan<br />8 Pepe<br />5 Juan<br />9 Pepe<br />6 Juan<br />Termina thread Pepe<br />7 Juan<br />8 Juan<br />9 Juan<br />Termina thread Juan<br />
  • 12. Iniciar una tarea: start<br />El inicio de la ejecución de una tarea se realiza mediante el método start() heredado de Thread.<br />start() es un método especial que invoca a run() y devuelve inmediatamente el control a la tarea que lo ha llamado.<br />
  • 13. Notas del Código<br />La clase Thread está en el paquete java.lang. Por tanto, no es necesario el import.<br />El constructor publicThread(Stringstr) recibe un parámetro que es la identificación del Thread.<br />El método run() contiene el bloque de ejecución del Thread. Dentro de él, el método getName() devuelve el nombre del Thread (el que se ha pasado como argumento al constructor).<br />El método main crea dos objetos de clase ThreadEjemplo y los inicia con la llamada al método start()(el cual inicia el nuevo hilo y llama al método run()).<br />Obsérvese en la salida el primer mensaje de finalización del threadmain. La ejecución de los hilos es asíncrona. Realizada la llamada al método start(), éste le devuelve control y continua su ejecución, independiente de los otros hilos.<br />En la salida los mensajes de un hilo y otro se van mezclando. La máquina virtual asigna tiempos a cada hilo<br />
  • 14. Explicación Simple<br />
  • 15. Resumen Creación/Ejecución de hilos en Java<br />Un objeto concurrente pertenece a una clase que extiende Thread.<br />Hay que redefinir el método run() que especifica la tarea concurrente.<br />La ejecución de la tarea concurrente se realiza mediante el método start() (heredado de Thread).<br />
  • 16. Síntesis<br />La clase Thread es la clase responsable de producir hilos funcionales para otras clases. Para añadir la funcionalidad de hilo a una clase simplemente se deriva la clase de Thread y se ignora el método run. <br />Es en este método run donde el procesamiento de un hilo toma lugar, y a menudo se refieren a él como el cuerpo del hilo. La clase Thread también define los métodos start y stop, los cuales te permiten comenzar y parar la ejecución del hilo, además de un gran número de métodos útiles.<br />
  • 17. Ejemplo 2<br />class Hilo extendsThread {<br />public Hilo(Stringstr) {<br />super(str);<br /> }<br />publicvoidrun() {<br />for (int i = 0; i <= 100; i++) {<br />System.out.println(i + " " + getName());<br /> try {<br />sleep((long) (Math.random() * 1000));<br /> } catch (InterruptedException e) {<br /> }<br />System.out.println("FIN! " + getName());<br /> }<br /> }<br />}<br />classThreadMiProgr {<br />publicstaticvoidmain(String[] args) {<br /> Hilo uno, dos;<br /> uno = new Hilo("Jamaica");<br /> dos = new Hilo("Fiji");<br />uno.start();<br />dos.start();<br />System.out.println("main no hace nada");<br /> }<br />}<br />
  • 18. Practica:<br />Cambia los siguientes elementos:<br />uno.start();<br />dos.start ();<br />Sutituyeestaslineasporlassiguientes:<br />uno.run(); <br />dos.run () ;<br />Comenta los resultados<br />
  • 19. Estados de un Thread<br />
  • 20. Diagrama de Estados de un Thread<br />
  • 21. Prioridades en los Threads<br />El criterio para la ejecución de múltiples hilos sobre una CPU se basa en prioridades:<br />El sistema (JRE) selecciona para ejecutar en cada instante el hilo (ejecutable) con prioridad más alta.<br />A igualdad de prioridad, selección arbitraria.<br />Los hilos heredan la prioridad del hilo que los crea.<br />La prioridad se puede cambiar:<br />void setPriority (long x) long getPriority( )<br />Un hilo de prioridad baja sólo podrá ejecutarse cuando todos los hilos de prioridad superior pasen al estado "No ejecutable"<br />
  • 22. Reparto de tiempo (Time Slicing)<br /> Método de asignación de tiempo de CPU a diferentes hilos de igual (o mayor) prioridad.<br />Cada intervalo de tiempo (ti) se selecciona un hilo a ejecutar en la CPU (prioridad >= al actual).<br />* Un hilo puede ceder su tiempo:<br />static void yield ( )<br />
  • 23. EL CICLO DE VIDA DE UN THREAD<br />
  • 24. EL CICLO DE VIDA DE UN THREAD<br />Cuando se instancia la clase Thread (o una subclase) se crea un nuevo Thread que está en su estado inicial ('New Thread' en el gráfico). En este estado es simplemente un objeto más.<br />No existe todavía el thread en ejecución. El único método que puede invocarse sobre él es el método start().<br />
  • 25. EL CICLO DE VIDA DE UN THREAD<br />Cuando se invoca el método start() sobre el hilo el sistema crea los recursos necesarios, lo planifica (le asigna prioridad) y llama al método run(). <br />En este momento el hilo está corriendo, se encuentra en el estado ‘runable’.<br />
  • 26. EL CICLO DE VIDA DE UN THREAD<br />Si el método run() invoca internamente el método sleep() o wait() o el hilo tiene que esperar por una operación de entrada/salida, entonces el hilo pasa al estado 'no runnable’ (no ejecutable) hasta que la condición de espera finalice. Durante este tiempo el sistema puede ceder control a otros hilos activos.<br />Por último cuando el método run finaliza el hilo termina y pasa a la situación 'Dead' (Muerto).<br />
  • 27. Interfaz Runnable<br />La interface Runnable proporciona un método alternativo a la utilización de la clase Thread, para los casos en los que no es posible hacer que la clase definida extienda la clase Thread.<br />Esto ocurre cuando dicha clase, que se desea ejecutar en un hilo independiente deba extender alguna otra clase. Dado que no existe herencia múltiple, la citada clase no puede extender a la vez la clase Thread y otra más. En este caso, la clase debe implantar la interface Runnable, variando ligeramente la forma en que se crean e inician los nuevos hilos.<br />
  • 28. Interfaz Runnable: Ejemplo<br />publicclassThreadRunneableimplementsRunnable {<br />publicvoidrun() {<br />for (int i = 0; i < 5; i++) {<br />System.out.println(i + " " +<br />Thread.currentThread().getName());<br /> }<br />System.out.println("Termina thread " +<br />Thread.currentThread().getName());<br /> }<br />publicstaticvoidmain(String[] args) {<br /> new Thread(new ThreadRunneable(), "Pepe").start();<br /> new Thread(new ThreadRunneable(), "Juan").start();<br />System.out.println("Termina threadmain");<br /> }<br />}<br />
  • 29. Interfaz Runnable: Ejemplo 2<br />classHiloThreadextendsThread {<br />publicvoidrun() {<br />while (true) {<br />System.out.println("Hola Curso java Modulo 2, soy el hilo HiloTread");<br /> }<br /> }<br />}<br />//Clase HiloRunnable<br />classHiloRunnableimplementsRunnable {<br />publicvoidrun() {<br />while (true) {<br />System.out.println("Hola Curso java Modulo 2, soy el hilo HiloRunnable");<br /> }<br /> }<br />}<br />classThreadRunneable {<br />publicstaticvoidmain(String[] args) {<br />//Creamos un hilo del primer tipo<br />//y lo ponemos en marcha<br />HiloThreadht = new HiloThread();<br />ht.start();<br />//Creamos un hilo del segundo tipo<br />//y lo ponemos en marcha<br />Threadhr = new Thread(new HiloRunnable());<br />hr.start();<br /> }<br />}<br />
  • 30. Practica: <br />Realiza un programa que implemente hilos en el cual se manejen prioridades.<br />
  • 31. Sockets<br />M. en I.S.C Leonardo Miguel Moreno Villalba<br />
  • 32. Sockets<br />Los sockets son un sistema de comunicación entre procesos de diferentes máquinas de una red. Más exactamente, un socket es un punto de comunicación por el cual un proceso puede emitir o recibir información.<br />
  • 33. Sockets<br />Utilizan una serie de primitivas para establecer el punto de comunicación, para conectarse a una máquina remota en un determinado puerto que esté disponible, para escuchar en él, para leer o escribir y publicar información en él, y finalmente para desconectarse.<br />
  • 34. Funcionamiento de un Socket<br />
  • 35. Funcionamiento<br />Normalmente, un servidor se ejecuta sobre una computadora específica y tiene un socket que responde en un puerto específico. El servidor únicamente espera, escuchando a través del socket a que un cliente haga una petición.<br />En el lado del cliente: el cliente conoce el nombre de host de la máquina en la cual el servidor se encuentra ejecutando y el número de puerto en el cual el servidor está conectado.<br />Para realizar una petición de conexión , el cliente intenta encontrar al servidor en la máquina servidora en el puerto especificado.<br />
  • 36. Implementación<br />La clase Socket se sitúa en la parte más alta de una implementación dependiente de la plataforma, ocultando los detalles de cualquier sistema particular al programa Java. Usando la clase java.net.Socket en lugar de utilizar código nativo de la plataforma, los programas Java pueden comunicarse a través de la red de una forma totalmente independiente de la plataforma.<br />De forma adicional, java.net incluye la clase ServerSocket, la cual implementa un socket el cual los servidores pueden utilizar para escuchar y aceptar peticiones de conexión de clientes.<br />
  • 37. Modelo de comunicaciones con Java<br />El servidor establece un puerto y espera durante un cierto tiempo (timeout segundos), a que el cliente establezca la conexión. Cuando el cliente solicite una conexión, el servidor abrirá la conexión socket con el método accept().<br />El cliente establece una conexión con la máquina host a través del puerto que se designe en puerto#<br />l cliente y el servidor se comunican con manejadores InputStream y OutputStream<br />
  • 38. Modelo de Comunicación Diagrama<br />
  • 39. CLASES PARA LAS COMUNICACIONES DE RED EN JAVA<br />Socket: Implementa un extremo de la conexión TCP.<br />ServerSocket: Se encarga de implementar el extremo Servidor de la conexión en la que se esperarán las conexiones de los clientes.<br />DatagramSocket: Implementa tanto el servidor como el cliente cuando se utiliza UDP.<br />DatagramPacket: Implementa un datagrampacket, que se utiliza para la creación de servicios de reparto de paquetes sin conexión.<br />InetAddress: Se encarga de implementar la dirección IP.<br />
  • 40. Tipos de sockets<br />Sockets TCP<br />Las aplicaciones piden al S.O. una comunicación controlada por TCP:<br />Orientada a la conexión<br />Comunicación fiable y ordenada<br />También se denominan sockets de tipo Stream<br />Sockets UDP<br />● Las aplicaciones piden al S.O. una comunicación controlada por UDP:<br />Transferencia de bloques<br />de datos<br />Sin conexión ni fiabilidad ni entrega ordenada<br />Permite difusiones<br />También se denominan sockets de tipo Datagrama<br />
  • 41. Dentro del paquete java.net existen tres clases de sockets:<br />Socket Cliente TCP<br />ServerSocket Servidor TCP<br />DatagramSocket Cliente/Servidor UDP<br />● También hay otras clases auxiliares que facilitan la programación de aplicaciones en red<br />
  • 42. Clase InetAddress<br />InetAddress es la clase que se utiliza para almacenar direcciones IP<br />Algunos métodos:<br />InetAddressgetByName(String nombre)<br />Obtiene la dirección IP asociada a un nombre<br />StringgetHostAddress()<br />Devuelve la dirección IP en formato "aa.bb.cc.dd“ <br />StringgetHostName()<br />Devuelve el nombre del host<br />
  • 43. Sockets TCP<br />Cliente:<br />Inicia la conexión con el servidor<br />Especifica la dirección IP y el puerto del proceso servidor<br />Cuando crea un socket establece la conexión con el servidor<br />Servidor:<br />Ha de estar en ejecución<br />Debe haber creado un socket<br />(1) donde recibir a los clientes que conectan con él<br />Espera a que algún cliente se conecte<br />
  • 44. Ejemplo Socket Cliente <br />import java.net.*;<br />import java.io.*;<br />classClienteTCP {<br />public static void main(String args[])<br />throwsUnknownHostException, IOException {<br />Socket s=new Socket(“localhost",5000);<br />BufferedReaderin=new BufferedReader(new<br />InputStreamReader(s.getInputStream()));<br />System.out.println(in.readLine());<br />s.close();<br />}<br />}<br />
  • 45. Socket Servidor<br />import java.net.*;<br />import java.io.*;<br />classServidorTCP {<br />public static void main(String args[]) throws UnknownHostException,IOException {<br />ServerSocketss=new ServerSocket(5000);<br />Socket s=ss.accept(); // espero a que llegue un cliente<br />PrintWriterout=new PrintWriter(s.getOutputStream(),true);<br />out.println("Bienvenido al servidor de prueba de Redes");<br />s.close();<br />ss.close();<br />}<br />}<br />
  • 46. Servidor TCP 2<br />import java.net.*;<br />import java.io.*;<br />class ServidorTCP2 {<br />publicstaticvoidmain(Stringargs[]) throwsUnknownHostException, IOException {<br />ServerSocketss = new ServerSocket(5000);<br />int cliente = 1;<br />while (true) {<br /> Socket s = ss.accept(); // espera una conexión de un cliente<br />PrintWriterout = new PrintWriter(s.getOutputStream(), true);<br />System.out.println("Eres el cliente " + cliente++);<br />s.close();<br /> }<br /> }<br />}<br />
  • 47. Cliente TCP 2<br />import java.net.*;<br />import java.io.*;<br />class ClienteTCP2 {<br />publicstaticvoidmain(Stringargs[]) throwsUnknownHostException, IOException {<br /> Socket s = new Socket("localHost", 5000);<br />BufferedReader in =<br /> new BufferedReader(new InputStreamReader(s.getInputStream()));<br />PrintWriterout = new PrintWriter(s.getOutputStream());<br />out.print("GET / HTTP/1.0" + "rn");<br />out.print("rn");<br />out.flush();<br />System.out.println(in.readLine());<br />s.close();<br /> }<br />}<br />
  • 48. Ejemplo Básico Cliente<br />import java.io.*;<br />import java.net.*;<br />class Cliente {<br />static final String HOST = "localhost";<br />static final int PUERTO=5000;<br />public Cliente( ) {<br />try{<br />Socket skCliente = new Socket( HOST , Puerto );<br />InputStreamaux = skCliente.getInputStream();<br />DataInputStreamflujo = new DataInputStream( aux );<br />System.out.println( flujo.readUTF() );<br />skCliente.close();<br />} catch( Exception e ) {<br />System.out.println( e.getMessage() );<br />}<br />}<br />public static void main( String[] arg ) {<br />new Cliente();<br />}<br />}<br />
  • 49. Ejemplo Básico Servidor<br />import java.net.* ;<br />class Servidor {<br />static final int PUERTO=5000;<br />public Servidor( ) {<br />try {<br />ServerSocketskServidor = new ServerSocket(PUERTO);<br />System.out.println("Escucho el puerto " + PUERTO );<br />for ( intnumCli = 0; numCli < 3; numCli++; ) {<br />Socket skCliente = skServidor.accept(); // Crea objeto<br />System.out.println("Sirvo al cliente " + numCli);<br />OutputStreamaux = skCliente.getOutputStream();<br />DataOutputStreamflujo= new DataOutputStream( aux );<br />flujo.writeUTF( "Hola cliente " + numCli );<br />skCliente.close();<br />}<br />System.out.println("Demasiados clientes por hoy");<br />} catch( Exception e ) {<br />System.out.println( e.getMessage() );<br />}<br />}<br />public static void main( String[] arg ) {<br />new Servidor();<br />}<br />}<br />
  • 50. Sockets UDP<br />M. En I.S.C. Leonardo M. Moreno Villalba<br />
  • 51. Sockets UDP<br />No se establece una conexión previa al envío/recepción de datos.<br />Los datos se envían en bloques (datagramas).<br />Los datagramas son objetos de la clase DatagramPacket. Cada datagrama contiene la dirección de destino y el puerto.<br />Los datagramas pueden no llegar en el mismo orden en que se enviaron.<br />Permiten difusiones (broadcast y multicast).<br />
  • 52. Sockets UDP<br />Para enviar o recibir datagramas (DatagramPacket) se utilizan objetos DatagramSocketo MulticastSocket.<br />Se diferencian por el tipo de canal:<br />DatagramSocket -- Punto a punto no dedicado<br />MulticastSocket -- Multipunto<br />
  • 53. Sockets UDP<br />Dos clases:<br />DatagramSocket: para enviar o recibir datagramas)<br />DatagramPacket: paquete de datos o datagrama<br />
  • 54. DatagramPacket<br />Paquete de datos (datagrama) a transmitir o recibir a través de un socket UDP (objeto DatagramSocket).<br />Un datagrama consta de:<br />Una cabecera: dirección de origen y destino del paquete, el puerto, la longitud del paquete, un checksum, etc.<br />Cuerpo: datos del paquete.<br />
  • 55. DatagramPacket: constructores<br />Para recibir datos:<br />DatagramPacket (byte[] buffer, int n)<br />Para enviar datos:<br />DatagramPacket(byte[] buffer, int n, InetAddressdest, intpuerto)<br />buffer: array que almacenará los datos a enviar o recibir-<br />n: tamaño máximo del datagrama a enviar o recibir<br />dest: es la dirección de la máquina destinataria del datagrama<br />puerto: puerto en el que atiende las peticiones el servidor<br />
  • 56. DatagramPacket: métodos<br />InetAddressgetAddress() -- Devuelve la dirección almacenada en el paquete<br />intgetPort() --Devuelve el puerto almacenado en el paquete<br />byte[] getData() -- Devuelve los datos almacenados en el paquete<br />intgetLength() --Devuelve el tamaño de los datos almacenados en el paquete<br />voidsetAddress(InetAddressdest) -- Establece la dirección dedestino<br />voidsetPort(int puerto) -- Establece el puerto destino<br />voidsetData(byte[] buffer)-- Establece los datos a enviar<br />voidsetLength(int n) -- Establece el tamaño máximo del paquete<br />
  • 57. DatagramSocket: constructores y métodos<br />Constructores<br />DatagramSocket() -- Crea un socket en cualquier puerto que haya libre en la máquina local.<br />DatagramSocket(intpuerto) -- Crea un socket en el puerto especificado<br />Métodos<br />voidsend(DatagramPacket p) -- Envia el datagrama p a través del socket<br />voidreceive (DatagramPacket p)--Recibe el datagrama p a través del socket<br />voidclose() -- Cierra el socket<br />

×