You are on page 1of 12

Programación Avanzada

Universidad del Aconcagua

Programación Avanzada
Java: Threads y Sonido

Esp. Ing. César Aranda


unidatos@gmail.com

Licenciatura en Informática y Desarrollo de Software


v.2014

Thread (Hilo)
 Conocido también como proceso ligero.
 Un thread es un flujo de ejecución secuencial dentro de
un proceso.
 Un mismo proceso java puede tener
 Un único thread (el thread principal) y por tanto se le llama
monotarea.
 Varios threads (por ejemplo el thread principal y el de gestión de
eventos). Y por tanto se le llama monotarea.

 Casi todas las clases referentes al manejo de threads se


encuentran en el paquete java.lang.*

Ing. César Omar Aranda 2

Ing. César Omar Aranda 1


Programación Avanzada
Universidad del Aconcagua

Multiproceso vs. Multitarea


 No hay que confundir los dos conceptos.
 Multiproceso significa que el equipo hardware cuenta
más de un procesador (CPU) y por tanto ejecuta varias
tareas a la vez.
 Multitarea significa que varias tareas comparten el único
procesador (CPU) dándonos la sensación de
multiproceso.
 La multitarea se consigue mediante un planificador de
tareas que van dando slots de CPU a cada tarea.

Ing. César Omar Aranda 3

Clase Thread
 La clase principal es java.lang,Thread.
 Nos ofrece el API genérico de los threads así como la
implementación de su comportamiento, incluyendo:
 Arrancar, dormirse , parar, ejecutarse, esperar, gestión de
prioridades.
 La lógica que se va a ejecutar un thread se incluye en el
método:
 public void run()
 Cuando termina la ejecución del método run() se termina
el thread.
 La clase java.lang.Thread contiene un método run()
vacío.
Ing. César Omar Aranda 4

Ing. César Omar Aranda 2


Programación Avanzada
Universidad del Aconcagua

Opción Runnable
 Se trata de una interfaz.

 Disponible como java.lang.Runnable

 Simplemente fuerza la implementación de un método:


 public void run().

 Existe para paliar la falta de herencia múltiple en el


lenguaje java.

Ing. César Omar Aranda 5

Implementando un Thread
 Existen dos técnicas para crear un thread:
 Heredar de la clase java.lang.Thread y sobreescribir el método
run().
 Implementar la interfaz java.lang.Runnable (por tanto tenemos
que implementar el método run()) y crear una instancia de la
clase java.lang.Thread pasándole el objeto que implementa
java.lang.Runnable como parámetro.

 Normalmente se usará la opción Runnable cuando la


clase que va a contener la lógica del thread ya herede
de otra clase (Swing, Applets,...)

Ing. César Omar Aranda 6

Ing. César Omar Aranda 3


Programación Avanzada
Universidad del Aconcagua

Ciclo de Vida

 Un thread puede encontrarse en diferentes estados:


 Ejecutándose
 Pausado o Parado
 Muerto
 Existen distintos métodos que provocan las transiciones
entre estos estados.
Ing. César Omar Aranda 7

Ejemplo: crear un Thread

public class AplicHilo1 {

public static void main(String args[])


{
TortugaThread tortuga=new TortugaThread();
Thread liebre=new Thread(new LiebreThread());
}
}

Ing. César Omar Aranda 8

Ing. César Omar Aranda 4


Programación Avanzada
Universidad del Aconcagua

Ejemplo de clase personalizada A


public class TortugaThread extends Thread {
public void run() {
int i=0;
System.out.println("Comienza la tortuga..");
while(i<5) {
try {
Thread.sleep(5000);
System.out.println("Tortuga..");
} catch(InterruptedException ex) {//…}
i++;
}
System.out.println("Termina la tortuga");
}
}
Ing. César Omar Aranda 9

Ejemplo de clase personalizada B


public class LiebreThread extends Thread {
public void run() {
int i=0;
System.out.println("Comienza la liebre..");
while(i<5) {
try {
Thread.sleep(2000);
System.out.println(“Liebre..");
} catch(InterruptedException ex) {//…}
i++;
}
System.out.println("Termina la liebre");
}
}
Ing. César Omar Aranda 10

Ing. César Omar Aranda 5


Programación Avanzada
Universidad del Aconcagua

Arrancar un Thread
 Para arrancar un thread hay que llamar al método start()

 El método start() registra al thread en el planificador de


tareas del sistema y llama al método run() del thread.

 Ejecutar este método no significa que de forma


inmediata comience a ejecutarse. Esto ya dependerá del
planificador de tareas (Sistema Operativo) y del número
de procesadores (Hardware)

Ing. César Omar Aranda 11

Ejemplo de Lanzamiento
public class EjemploConHilos1 {

public static void main(String args[]) {

TortugaThread tortuga = new TortugaThread();

Thread liebre = new Thread(new LiebreThread());

tortuga.start();
liebre.start();

}
}

Ing. César Omar Aranda 12

Ing. César Omar Aranda 6


Programación Avanzada
Universidad del Aconcagua

Ejemplo de Ejecución

Ing. César Omar Aranda 13

Pausar un thread
 Existen distintos motivos por los que un thread puede
detenerse temporalmente su ejecución o lo que es lo
mismo, pasar a un estado de pausa:

 Se llama a su método sleep(). Recibe un long con el número de


milisegundos de la pausa.
 Se llama al método wait() y espera hasta recibir una señal (notify)
o cumplirse un timeout definido por un long indicando el número
de milisegundos.
 Se realiza alguna acción de entrada/salida.
 Se llama al método yield(). Este método saca del procesador al
thread hasta que el sistema operativo lo vuelva a meter.

Ing. César Omar Aranda 14

Ing. César Omar Aranda 7


Programación Avanzada
Universidad del Aconcagua

Reanudar un thread
 Existen distintos motivos por los que un thread puede
reanudar su ejecución:

 Se consumen los milisegundos establecidos en una llamada al


método sleep.

 Se recibe una llamada (notify) o se consumen los milisegundos


en una llamada al método wait.

 Se termina alguna acción de entrada/salida.

Ing. César Omar Aranda 15

Terminar un thread
 Un thread, por defecto, termina cuando finaliza la
ejecución de su método run().
 En las primeras versiones de JDK existía el método
stop(). Pero con el tiempo se descartó (deprecated) y se
ha desaconsejando su uso.
 La manera correcta de terminar un thread es conseguir
que finalice la ejecución del método run() mediante la
implementación de algún tipo de bucle gobernado por
una condición controlable.
 El método System.exit() termina la JVM, terminando
también todos los threads.

Ing. César Omar Aranda 16

Ing. César Omar Aranda 8


Programación Avanzada
Universidad del Aconcagua

Iniciar, parar, terminar un thread

Ing. César Omar Aranda 17

API Java Sound


 javax.sound.sampled
 Proporciona las clases e interfaces para capturar, procesar y
reproducir los datos de audio
 javax.sound.sampled.spi
 Proporciona interfaces para desarrollar aplicaciones basadas en
el paquete anterior.
 javax.sound.midi
 Proporciona las interfaces y las clases necesarias para la E/S,
secuencia y sintesis de archivos MIDI
 javax.sound.midi.spi
 Proporciona interfaces para desarrollar aplicaciones basadas en
el paquete anterior.

Ing. César Omar Aranda 18

Ing. César Omar Aranda 9


Programación Avanzada
Universidad del Aconcagua

Interfaz Clip: algunos métodos


 int getFrameLength()
 Método que nos devuelve un número entero en representación
del valor de la longitud de los frames del audio.
 Long getMicrosecondLength()
 Método que nos devuelve el tiempo de reproducción en
microsegundos.
 void loop(int n)
 Método que repite la reproducción del audio ‘N' veces. Podemos
ponerlo en un loop infinito de la siguiente manera:
loop(Clip.LOOP_CONTINUOUSLY);
 void open(AudioInputStream ais)
 Método que nos abre el clip de audio y los flujos presentes en
formato de la entrada de audio.
Ing. César Omar Aranda 19

Interfaz DataLine
 void start(), stop()
 Comenzar y Detener la reproducción del archivo.
 void drain()
 Detener el archivo hasta que el buffer quede limpio.
 void flush()
 int available()
 Conocer el número de bytes libres en el buffer.
 AudioFormat getFormat()
 Devuelve el formato de audio.
 int getBufferSize()
 Devuelve el tamaño del buffer en bytes.
 boolean isRunning()
 Indica si la línea de audio esta abierta.
Ing. César Omar Aranda 20

Ing. César Omar Aranda 10


Programación Avanzada
Universidad del Aconcagua

Uso de librerías adicionales

Ing. César Omar Aranda 21

Ejemplo de uso en minitenis

Ing. César Omar Aranda 22

Ing. César Omar Aranda 11


Programación Avanzada
Universidad del Aconcagua

Referencias
 http://docs.oracle.com/javase/tutorial/sound/TOC.html
 http://edu4java.com/es/game/game7.html
 http://cprades.eresmas.com/Tecnica/sonidoenjava.html
 http://www.oracle.com/technetwork/java/tiger-140463.html
 http://www.codejava.net/coding/how-to-play-back-audio-in-java-with-
examples
 http://lineadecodigo.com/java/reproducir-musica-por-java/
 http://www.redeszone.net/2012/08/20/curso-java-volumen-iv-
gestion-de-threads/
 http://www.developer.com/java/other/article.php/2173111/Java-
Sound-Playing-Back-Audio-Files-using-Java.htm
 http://picarcodigo.blogspot.com.ar/2013/01/poner-sonido-nuestras-
aplicaciones-java.html
Ing. César Omar Aranda 23

Ing. César Omar Aranda 12

You might also like