Skip to content

Instantly share code, notes, and snippets.

@pedrojoya
Created December 5, 2012 11:26
Show Gist options
  • Save pedrojoya/4214870 to your computer and use it in GitHub Desktop.
Save pedrojoya/4214870 to your computer and use it in GitHub Desktop.
J7CC0301-SemaforoBinario
package es.iessaladillo.pedrojoya.pspro.j7cc0301.tarea;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
// Simula la cola de impresión de una impresora.
public class Impresora {
// Creo un semáforo binario para controlar la impresión en la cola.
private final Semaphore semaforo = new Semaphore(1);
// Imprime el documento que se le pasa como parámetro.
public void imprimir(Object documento){
SimpleDateFormat formateador = new SimpleDateFormat("HH:mm:ss");
try {
// Adquiero el semáforo.
semaforo.acquire();
// Informo de que se ha iniciado la impresión.
System.out.printf("%s -> %s: Impresión iniciada\n",
formateador.format(new Date()),
Thread.currentThread().getName());
// Simulo que la impresión dura un valor aleatorio de segundos
// con valor máximo de 5 segundos.
Random aleatorio = new Random();
TimeUnit.SECONDS.sleep(aleatorio.nextInt(5));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// Informo de que la impresión ha finalizado.
System.out.printf("%s -> %s: Impresión finalizada\n",
formateador.format(new Date()),
Thread.currentThread().getName());
// Libero el semáforo.
semaforo.release();
}
}
}
package es.iessaladillo.pedrojoya.pspro.j7cc0301.main;
import es.iessaladillo.pedrojoya.pspro.j7cc0301.tarea.Impresora;
import es.iessaladillo.pedrojoya.pspro.j7cc0301.tarea.Trabajo;
public class Main {
public static void main (String args[]){
// Creo una nueva impresora.
Impresora impresora = new Impresora();
// Creo e inicio 10 hilos que ejecutan 10 trabajos.
Thread hilos[]= new Thread[10];
for (int i = 0; i < 10; i++){
hilos[i] = new Thread(new Trabajo(impresora), "Trabajo " + i);
}
// Lo hago en dos bucles distintos para que se
// lance la ejecución de todos a la vez.
for (int i = 0; i < 10; i++){
hilos[i].start();
}
}
}
package es.iessaladillo.pedrojoya.pspro.j7cc0301.tarea;
// Trabajo que envía un documento a la impresora.
public class Trabajo implements Runnable {
// Propiedades.
private Impresora impresora;
// Constructor
public Trabajo(Impresora impresora){
this.impresora = impresora;
}
@Override
public void run() {
impresora.imprimir(new Object());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment