Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porClaudia Segura Quintana Modificado hace 9 años
1
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores 1 Ejemplo de Threads: escritura de la clase public class SimpleThread extends Thread { public SimpleThread(String str) { super(str); } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { this.sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) {} } System.out.println("DONE! " + getName()); } El método this.sleep(milisegundos) debe ir en un bloque try and catch
2
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores 2 Ejemplo de Threads: Uso de la clase nueva public class TwoThreadsTest { public static void main (String[] args) { SimpleThread t1,t2; t1 = SimpleThread("Jamaica"); t2 = SimpleThread("Fiji"); t1.start(); t2.start() } El método start() inicia la ejecucón de un thread. Esto implica que se empieza a ejecutar el código escrito en el método run del thread. También existen otros métodos que se le pueden aplicar a un thread: suspend(), resume(), stop().
3
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores 3 Problemas de sincronización con Threads Los threads tienen la ventaja que pueden compartir memoria Esto también es una desventaja cuando se requiere algún orden en la administración de los recursos Pensemos en el problema de “repartir” (consumir) números. Si el productor de números está en el servidor y hay varios threads clientes que piden números, debemos tener cuidado de no repartir el mismo número a clientes distintos Veamos el problema de la sincronización en un ejemplo
4
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores 4 Cómo usar threads para hacer servidores concurrentes Hacer una clase Thread que tenga como variables de un objeto un socket y flujos de entrada y/o salida. Programar el constructor de modo que reciba como parámetro un socket y haga todo lo necesario para dejar inicializado el ambiente para empezar a atender al cleinte (por ejemplo, abrir flujos de datos de entrada y/o salida del socket recibido) Programar el método run de modo que implemente el protocolo necesario. Programar un método main que en un ciclo infimito se ponga a escuchar en un port dado la llegada de clientes. Con cada cliente nuevo crear un thread nuevo y pasar como parámetro el socket
5
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores 5 Veamos un ejemplo: Primero veremos un servidor iterativo que atiende a clientes en un ciclo La atención consiste en enviar una serie de números que el cliente va leyendo e imprimiendo Sin cambiar ni una línea de código en el cliente, reeplazaremos el servidor por uno concurrente. Ejercicio: Copiar los archivos UnClienteQueEscribe.java y UnServidorQueOye.java y completar lo que falta Ojo: no hay concurrencia, ES MUY SIMPLE Ponerse a Escribir !!!! (los primeros 2 grupos que logren comunicación de ida y vuelta tienen 0.5+ en la prueba)
6
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores 6 Cuando un programa debe comportarse como cliente y servidor a la vez: el teléfono Un teléfono es un cliente y un servidor a la vez Se comporta como servidor cuando recibe una llamada Se comporta como cliente cuando efectúa una llamada El servidor crea un socket asociado a un por desde donde escucha si hay alguien que quiere llamar. El cliente queda esperando que el usuario de un comando para llamar a algun servidor (por ejemplo esperar del teclado que el usuario ingrese un nombre de host para llamar) El problema es que deben estar los 2 en el mismo programa: usamos threads, uno para el servidor y otro para el cliente. Ambos quedan esperando y se da curso a lo que pase primero.
7
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores 7 Cuando un programa debe comportarse como cliente y servidor a la vez: el teléfono Un teléfono es un cliente y un servidor a la vez Se comporta como servidor cuando recibe una llamada Se comporta como cliente cuando efectúa una llamada El servidor crea un socket asociado a un por desde donde escucha si hay alguien que quiere llamar. El cliente queda esperando que el usuario de un comando para llamar a algun servidor (por ejemplo esperar del teclado que el usuario ingrese un nombre de host para llamar) El problema es que deben estar los 2 en el mismo programa: usamos threads, uno para el servidor y otro para el cliente. Ambos quedan esperando y se da curso a lo que pase primero.
8
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores 8 Cuando un programa debe comportarse como cliente y servidor a la vez: el teléfono (2) Otro problema: no se deben aceptar peticiones de llamadas si es que se da curso a una llamada (se activa el thread del cleinte) No se puede dar curso a una llamada si se atendó a una (se activa el thread de servidor) La idea es suspender un thread cuando se activa el otro. Para esto se necesita que ambos conozcan el otro thread. Al crear uno se le da un puntero al otro ! Ver programas telefono.java El cliente sólo puede escribir, el servidor sólo puede leer, Modifíquelos !
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.