Sie sind auf Seite 1von 20

REDES Y ENTORNOS MULTIJUGADOR

Tema 9 Hilos en Java


Curso 2012/2013

1. Programacin multihilo

Normalmente los programas tienen un comportamiento secuencial y un nico camino de ejecucin, tienen:
Un punto de inicio Una secuencia de ejecucin Un final

Cuando en un programa se quiere realizar ms de una tarea simultneamente se utilizan tcnicas de ejecucin que permiten que diversos puntos del programa se estn ejecutando a la vez.
Programa multihilo: contiene dos o mas partes que pueden ejecutarse de forma simultnea.
permite realizar muchas actividades simultneas en un programa.

Java proporciona soporte para la programacin multihilo


2

1. Procesos e Hilos

Proceso
Programa en ejecucin Recursos propios que se crean durante la vida de un proceso y se destruyen cuando finaliza:
Espacio propio de direcciones Memoria Variables Ficheros Registros, seales, etc.

En SO, un proceso es la unidad mnima de cdigo que puede seleccionar el planificador, cuando hablamos de un sistema multitarea. La multitarea basada en procesos no est bajo control de Java

1. Procesos e Hilos

Hilo
Unidades concurrentes dentro de un programa. Un nico programa puede realizar dos o ms tareas de forma simultnea (hilos). Son tareas ligeras: bajo coste en consumo de recursos, que permiten el uso ptimo de la CPU Comparten recursos con otros hilos y con el proceso:
Mismo espacio de direcciones Mismo espacio de memoria Mismas variables globales Mismo conjunto de ficheros abiertos Seales, etc.

Al compartir recursos, los threads se crean ms rpido que los procesos y los cambios de contexto entre threads son menos costosos Java controla la multitarea.
4

1. Procesos e Hilos

Un programa que ejecuta paralelamente distintos hilos, se divide en algn momento en varios procesos (threads) que se ejecutan simultneamente Para qu?
Programas que tengan que realizar varias tareas de forma simultnea. Servidores concurrentes

Problemas: Acceso simultneo a recursos


compartidos. Ejemplo: Acceso simultneo de dos personas a una cuenta bancaria
Necesidad de bloqueo de uno de ellos durante unos segundos, hasta que la operacin del otro se haya actualizado.
5

2. Creacin de un hilo

Formas de Creacin de un hilo


Mediante herencia extendiendo de la clase java.lang.Thread Implementando la Interfaz java.lang.Runnable

La clase Thread. Algunos mtodos:


getName: Obtiene el nombre de un hilo getPriority: Obtiene la prioridad de un hilo isAlive: Determina si un hilo todava se est ejecutando join: Espera la terminacin de un hilo run: punto de entrada de un hilo. Contiene el cdigo que ejecutar el hilo sleep: suspende un hilo durante un tiempo determinado start: comienza un hilo, llamando a su mtodo run
6

2. Creacin de un hilo
Un hilo de ejecucin es un objeto de la clase java.lang.Thread Como cualquier otro objeto, se puede almacenar en una variable, tiene constructor, mtodos, etc... El cdigo que se ejecutar en el nuevo hilo de ejecucin se indica en el constructor con un objeto de una clase que implemente el interfaz java.lang.Runnable Cuando se ejecuta el mtodo start() en el Thread se crea un hilo y se ejecuta el cdigo del mtodo run() del Runnable

2. Creacin de un hilo
public class Programa Gestin de hilos public static void args) { Thread thread = new Thread(new Hilo()); thread.start(); } { en Java main(String[]

public class Hilo implements Runnable { @Override public void run() { System.out.println("Soy un hilo"); } }

2. Creacin de un hilo
public class Programa Gestin de hilos public static void args) { Thread thread = new Thread(new Hilo()); thread.start(); } Comienza la ejecucin del hilo { en Java main(String[]

El cdigo del hilo se codifica en una clase que implementa el interfaz Runnable public class Hilo implements Runnable { @Override public void run() { System.out.println("Soy un hilo"); } El mtodo run() se ejecutar cuando } comience la ejecucin del hilo

3. Creacin de varios hilos

public class Programa { public static void main(String[] args) { Thread t1 = new Thread(new Hilo(1), "Hilo1"); t1.start(); Thread t2 = new Thread(new Hilo(2), "Hilo2"); t2.start(); } } public class Hilo implements Runnable {

Gestin de hilos en Java

private int numHilo;


public Hilo(int numHilo){ this.numHilo = numHilo; } @Override public void run() { while(true){ System.out.println("Soy el hilo: "+numHilo); } } }

3. Creacin de varios hilos

public class Programa { public static void main(String[] args) { Thread t1 = new Thread(new Hilo(1), "Hilo1"); t1.start(); Thread t2 = new Thread(new Hilo(2), "Hilo2"); t2.start(); } } public class Hilo implements Runnable {

Gestin de hilos en Java

Comienza la ejecucin del hilo (llamada al mtodo run del hilo)

private int numHilo;


public Hilo(int numHilo){ this.numHilo = numHilo; }

@Override public void run() { while(true){ System.out.println("Soy el hilo: "+numHilo); } } }

Contiene el cdigo que ejecuta el hilo

3. Creacin de varios hilos


Ejecucin: Soy el hilo: 1 Soy el hilo: 1 Soy el hilo: 2 Soy el hilo: 2 Soy el hilo: 1 Soy el hilo: 1 Soy el hilo: 1 Soy el hilo: 2 Soy el hilo: 2 Soy el hilo: 2 Soy el hilo: 1 Soy el hilo: 1 Soy el hilo: 1 Soy el hilo: 2 Soy el hilo: 1 Soy el hilo: 1
12

4. Documentacin

JavaDoc de la clase Thread


http://download.oracle.com/javase/7/docs/api/java/lang/Thread.html

JavaDoc de la clase Runnable


http://download.oracle.com/javase/7/docs/api/java/lang/Runnable.html

Tutorial oficial de concurrencia en Java


http://download.oracle.com/javase/tutorial/essential/concurrency/

5. Para qu utilizar hilos?

SIN HILOS
Solicitar Cliente Servidor

El servidor recibe solicitudes de los clientes En servidor:


Decodificacin de la solicitud del cliente Procesamiento

Problemas de latencia
Si el servidor est ocupado procesando una solicitud no puede procesar otras Reduccin de disponibilidad global del servicio
14

5. Para qu utilizar hilos?

Hilos para eliminar tiempos de espera

Solicitar Cliente Servidor

Procesar

Auxiliar

El Hilo auxiliar procesa la peticin del cliente, y el programa servidor no se queda bloqueado en esa tarea, puede seguir atendiendo Elimina tiempos de espera a los usuarios. Elimina cuellos de botella Aunque el procesamiento tenga un coste temporal elevado, el servidor puede seguir admitiendo nuevas solicitudes

15

5. Para qu utilizar hilos?

Servir a varios clientes (Servidor concurrente)


Cliente 1 Cliente 2 Servidor Auxiliar 1

Auxiliar 2

Cliente 3 Cliente 4

Auxiliar 3

Auxiliar 4

Un hilo por cada sesin que dependa de una conexin diferente Mejora la disponibilidad
16

5. Para qu utilizar hilos?

Ejemplo de servidor concurrente

int port = ... ServerSocket serverSocket = new ServerSocket(port); while (true) { Socket socket = serverSocket.accept(); Thread t = new Thread(new Conexion(socket)); t.start(); }

5. Para qu utilizar hilos?


public class Conexion implements Runnable { private Socket socket; public ProcesadorEco(Socket socket) { this.socket = socket; } public void run() { try { PrintWriter salida= new PrintWriter (c.getOutputStream(), true); BufferedReader entrada= new BufferedReader ( new InputStreamReader (c.getInputStream()));

// Envo y recepcin de informacin ...

entrada.close(); salida.close(); socket.close();


} catch (IOException e) { System.out.println("Fallo en la conexin.");

5. Para qu utilizar hilos?

Lograr concurrencia en un programa


Enviar Cliente Hilo 1

Recibir

Hilo 2

Lograr que un mismo programa haga varias tareas diferentes Ejemplo: cliente pueda leer y escribir a la vez

19

REDES Y ENTORNOS MULTIJUGADOR


Tema 9 Hilos en Java
Curso 2012/2013

Das könnte Ihnen auch gefallen