Módulo ECI - 11: Fundamentos de Redes de Computadores
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
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
1
Módulo ECI - 11: Fundamentos de Redes de Computadores
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().
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
2
Módulo ECI - 11: Fundamentos de Redes de Computadores
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
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
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
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
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)
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
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.
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
6
Módulo ECI - 11: Fundamentos de Redes de Computadores
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.
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
7
Módulo ECI - 11: Fundamentos de Redes de Computadores
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 !
8
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Descargar

Fundamentos de Redes de Computadores