ICOM 5007- SISTEMAS OPERATIVOS

 

Instructor: Héctor M Lugo Cordero

e-mail: hector.lugo@ece.uprm.edu

 

Laboratorio 3 – Java Threads

I Objetivos

 

II Teoría

 

En la práctica pasada estudiamos el uso de la creación de procesos pesados. Quedamos en que los procesos pesados corren en un área de memoria reservada para ellos en individual. La comunicación entre estos es bastante compleja y la estudiaremos mas adelante.

Un thread es conocido también como proceso liviano. El Java Virtual Machina (JVM) permite que múltiples threads corran simultáneamente. Estos threads (procesos livianos) correrán en la misma área de memoria reservada para ellos, facilitando así la comunicación entre ellos.

Los threads tienen una prioridad dando más preferencia a aquellos threads que tengan prioridad más alta sobre otros con prioridad menor. Cuando un thread crea otro thread el hijo adquiere por defecto prioridad igual a la del padre.

Existen dos maneras de crear threads la primera es hacer una clase que extienda la clase Thread (extends Thread). Dicha clase tiene que re-escribir el método run de la clase Thread. Luego simplemente se crea una instancia del thread y se comienza la misma.

public class MyThread extends Thread {

            //Campos de instancia y métodos necesarios

            @Override

            public void run() {

                        //TODO: Aqui va lo que hace el Thread

             }

}

 

La otra manera es crear una clase que implemente el interfaz Runable, al implementar esta interfaz nos vemos obligados a escribir el método run. Esta clase entonces puede ser pasada como parámetro al constructor de la clase Thread como un objeto.

 

public class ThreadCounter implements Runable

{

            //Campos de instancia y métodos necesarios

            @Override

            public void run() {

                        //TODO: Aqui va lo que hace el Thread

             }

 

}

 

Luego:

            ThreadCounter count = new ThreadCounter();

            Thread test = new Thread(count);

 

En ambos casos para comenzar la ejecución del thread es:

test.start();

 

Lista de métodos útiles de la clase Thread:

 

Método

Descripción

start()

Comienza la ejecución de un thread

static Thread currentThread()

Devuelve una referencia al thread que está corriendo actualmente.

join() o join(long milis)

Espera a que termine un thread o hasta milis milisegundos antes de continuar la ejecución principal. El thread termina si regresa del método run o si ocurre alguna excepción.

static void sleep(long milis)

Causa que el thread actual se vaya a dormir por milis milisegundos.

boolean isAlive()

Retorna cierto si el thread sigue con vida (corriendo).

long getId()/void setId(long id)

Getter y setter para el id del thread

String getName() / void setName(String name)

Getter y setter para el name del thread

int getPriority() / void setPriority(int p)

Getter y setter para el priority del thread.

Posibles valores pueden ser:

static int MAX_PRIORITY

static int MIN_PRIORITY

static int NORM_PRIORITY

static void yield()

Causa que el thread actual se interrumpa y le de paso a otro thread para ejecutarse.

String toString()

Devuelve la información del thread (nombre, prioridad y grupo) en un String

           

III Práctica

Van a crear una especie de juego RPG. En este juego simularan una batalla de dos enemigos contra un equipo de héroes. Afortunadamente el enemigo solo podrá defender no atacar. De igual manera el héroe sólo atacará y no se defenderá.

 

Un enemigo contiene su HP (hit points), que es un entero con el valor restante de vida o sea cuando este llega a 0 muere. Además contiene un número DP (defense points) que irá variando de manera aleatoria entre 0 y 100.

 

Por otro lado el héroe pose también HP y en este caso AP (attack points). Los AP varían de igual manera a los DP pero estos van desde 0 a 60 solamente. Cuando un héroe ataca y el AP es mayor al DP de su oponente, el cual puede ser cualquiera de los dos enemigos, el HP del enemigo que fue atacado se reduce por el valor igual a la diferencia AP – DP. Sin embargo si el AP es menor al DP entonces el daño lo recibe el héroe y es igual a DP – AP.

 

Cuando mueren los dos enemigos o los dos héroes entonces se termina la batalla y se dice el bando ganador y cuando HP le quedaba a los miembros del mismo o al miembro en caso de que uno haya muerto.

 

Un tercer héroe será añadido para prolongar la vida de los otros dos héroes atacantes. Este héroe no posee AP si no que MP (magic points) que varían de manera aleatoria (0 – 10) también y no causan daño al oponente sólo recuperan el HP de los dos compañeros atacantes. Este héroe no puede ser atacado por el enemigo, pero tampoco puede ganar una batalla, o sea si los otros dos héroes mueren este también lo hará.