sopuniii hilos [modo de compatibilidad]

11
01/03/2011 1 Laboratorio I Java Threads (Silberschatz Galvin) Un proceso es un programa ejecutandose 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

Upload: others

Post on 21-Nov-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

01/03/2011

1

Laboratorio I

Java Threads (Silberschatz Galvin)

� Un proceso es un programa ejecutandose 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

01/03/2011

2

� Existen tareas que se deben realizar en paralelo. Mas de una actividad simultanea o concurrente.

� Ejemplos. El Sistema operativo puede enviar mail, escuchar música, recibir mensajes, imprimir simultáneamente.

� Existen leguajes de programación que no permiten realizar operaciones concurrentes, solo dejan ejecutar procesos de forma secuencial.

� Un hilo es una secuencia de codigo enejecucion dentro del contexto de un proceso.

� Los hilos no pueden ejecutarse por si solos,necesitan la suervision de un proceso padrepara correr.

� Dentro de cada proceso hay varios procesosejecutandose.

� Los hilos a menudo son llamados procesosligeros

01/03/2011

3

Un hilo (o proceso ligero) es una unidad básica de utilización del CPU; consiste de:

◦ Contador de programa

◦ Conjunto de registros

◦ Espacio de stack

� Un hilo comparte con sus hilos pares:◦ Sección de código

◦ Sección de datos

◦ Recursos del sistema operativo

◦ En conjunto se les conoce como tarea

� Un proceso tradicional o pesado, es igual a una tarea con un hilo.

01/03/2011

4

.

Sistema operativo que mantiene varios hilos de ejecución dentro de un mismo proceso.◦ MS-DOS soporta un solo hilo.

◦ UNIX soporta múltiples procesos de usuarios, pero sólo un hilo por proceso.

◦ Windows 2000, Solaris, Linux, Mach, y OS/2 soportan múltiples hilos.

01/03/2011

5

Java.lang

� ThreadThreadThreadThread: es responsable de producir hilos funcionales para otras clases

� RunnableRunnableRunnableRunnable: proporciona la capacidad de anadir la funcionalidad de un hilo a una clase implementando la interfaz en lugar de derivarla de Thread

� ThreadDeathThreadDeathThreadDeathThreadDeath proporciona un mecanismo que permite hacer limpieza despues de que un hilo haya sido finalizado de forma asincrona. Deriva de la clase error

� ThreadGroup ThreadGroup ThreadGroup ThreadGroup se usa para manejar un grupo de hilos de modo conjunto

� ObjectObjectObjectObject

� En Java, los hilos comparten el mismo espacio de memoria. Inclusocomparten gran parte del entorno de ejecución, de modo que la creaciónde nuevos hilos es mucho más rápida que la creación de nuevosprocesos.

� Son dos los mecanismos que nos permiten crear hilos:implementando la interfaz Runnable, o extendiendo la claseThread, esto es, creando una subclase de esta clase.

� Con la creación previa de una subclase de la clase Thread

class MiThread extends Thread {

public void run() {. . .}

}

Es en el método rundonde se implementa

el código correspondientea la acción (la tarea)

que el hilo debedesarrollar

01/03/2011

6

� los hilos se arrancan con el método start

� se suspenden con el método suspend

� se reanudan con el método resume

� se detienen con el método stop (el cual supone también la muerte del hilo y la correspondiente excepción ThreadDeath),

� Un hilo suspendido puede reanudarse en la instrucción del método run en la que fue suspendido.

public MiHilo extends Thread{

public void run(){

// Aquí el código pesado // que tarda mucho

} };...MiHilo elHilo = new MiHilo();elHilo.start();System.out.println(“Y todo continua");

01/03/2011

7

� En el caso de crear un hilo extendiendo la clase Thread, se pueden heredar los métodos y variables de la clase padre. Si es así, una misma subclase solamente puede extender o derivar una vez de la clase padre Thread. Esta limitación de Java puede ser superada a través de la implementación de Runnable. Veamos el siguiente ejemplo:

� En este caso necesitamos crear una instancia de Thread antes de que el sistema pueda ejecutar el proceso como un hilo. Además, el método abstracto run que está definido en la interfaz Runnable tiene que implementarse en la nueva clase creada.

public class MiThread implements Runnable {Thread t;public void run() {// Ejecución del thread una vez creado}}

public class HolaRunnable implements Runnable{

public void run() {System.out.println("Hola desde un hilo");

}public static void main(String args[]){

(new Thread(new HolaRunnable ())).start();}

} public class HolaThread extends Thread{

public void run(){

System.out.println(“Hola desde un Hilo!");}public static void main(String args[]){

(new HolaThread()).start();}

}

01/03/2011

8

public class SleepMessages{

public static void main (String args []) throws InterruptedException

{String info [] = {"cuatro", "cinco", "veinte",

"diez" };for (int i = 0 ; i < info.length ; i++){

//Pause for 4 secondsThread.sleep (4000);//Print a messageSystem.out.println (info [i]);

}}

}

� El comportamiento de un hilo depende del estado en que se encuentre, este estado define su modo de operación actual, por ejemplo, si esta corriendo o no.

� La relación de estados en los que puede estar un hilo Java.

� New

� Runnable

� Not running

� Dead

01/03/2011

9

Los eventos que pueden hacer que un hilo esté parado de modo temporal o que el hilo pase al estado not running son:◦ El método suspend

◦ El método sleep

◦ El método wait

◦ El hilo esta bloqueado por I/O

La lista de eventos correspondientes que pueden hacer que el hilo pase al estado runnable son. ◦ Si un hilo está suspendido, la invocación del

método resume◦ Si un hilo está durmiendo, pasarán el número

de milisegundos que se ha especificado que debe dormir◦ Si un hilo está esperando, la llamada a notify o

notifyAll por parte del objeto por el que espera◦ Si un hilo está bloqueado por I/O, la

finalización de la operación I/O en cuestión

01/03/2011

10

Un hilo entra en estado dead cuando ya no es un objeto necesario. Los hilos en estado dead no pueden ser resucitados y ejecutados de nuevo. Un hilo puede entrar en estado dead a través de dos vías:◦ El método run termina su ejecución.

◦ El método stop es llamado.

NACIDO

BLOQUEADO

FINALIZADO

DURMIENDO

ESPERANDO

CORRIENDOLISTO

wait()

start()

notify()notifyAll()

sleep()

01/03/2011

11

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");

}

}