/**************************************************************/
/* Prof. Dr. Carsten Vogt                                     */
/* FH Koeln, Fak. 07 / Nachrichtentechnik                     */
/* http://www.nt.fh-koeln.de/vogt                             */
/*                                                            */
/* wechselseitiger Ausschluss mit Semaphor:                   */
/* Seit der Version 5 stellt Java die Klasse "Semaphor" zur   */
/* Verfuegung.                                                */
/**************************************************************/

import java.util.concurrent.*;

/* Thread, der einen wechselseitigen Ausschluss mit Hilfe eines Semaphors durchsetzen moechte. */

class EinThread extends Thread {

 private Semaphore sem;  /* Semaphor-Objekt, mit dem der w.A. durchgesetzt wird. */
 private String name;   /* Name des Threads, der bei Ausgaben verwendet wird. */

 /* Konstruktor */ 

 EinThread(String name, Semaphore sem) {
  this.name = name;
  this.sem  = sem;
 }

 /* run()-Methode mit wechselseitigem Ausschluss */

 public void run() {
  try {
   sem.acquire();
   System.out.println(name+" betritt kritischen Abschnitt");
   sleep(2000);
   System.out.println(name+" verlaesst kritischen Abschnitt");
   sem.release();
  } catch (Exception e) { }
 }

}


/* Hauptprogramm */

class ThreadWAMitSemaphor {

 public static void main(String[] args) {

  /* Erzeugung des Semaphor-Objekts fuer den wechselseitigen Ausschluss. */

  Semaphore sem  = new Semaphore(1);

  /* Erzeugung und Start zweier Threads, die sich ueber den Semaphor synchronisieren. */

  EinThread T1 = new EinThread("T1",sem);
  EinThread T2 = new EinThread("T2",sem);

  T1.start();
  T2.start();
  
 }

}
