Implementierung und Anwendung von Semaphoren
|
|
Bild 0-1: Verwendung eines Semaphor-Objektes
|
public class Semaphore
{
private int zaehler = 0;
private Thread warteschlange = null;
public void init(int i)
{
zaehler = i;
warteschlange = null;
}
public void anfordern(Thread thread)
{
zaehler--;
if(zaehler<0)
{
warteschlange = thread;
try
{
warteschlange.suspend();
}
catch(Exception e)
{
}
}
}
public void freigeben()
{
zaehler++;
// if(warteschlange!=null)
if(zaehler<=0)
warteschlange.resume();
}
}
Code 0-1: Semaphore.java in Projekt 003_semaphore
public class SchreibenA extends Thread
{
public boolean einser = false;
public void run()
{
while(true)
{
Hauptprogramm.semaphore.anfordern((Thread)this);
System.out.println("A schreibt.");
for(int i=0;i<30;i++)
{
if(einser)
Hauptprogramm.arrA[i]=1;
else
Hauptprogramm.arrA[i]=0;
Hauptprogramm.pausieren(20);
}
System.out.println("A fertig.");
Hauptprogramm.semaphore.freigeben();
//Erledige andere Aufgaben:
Hauptprogramm.pausieren(50);
einser = !einser;
}
}
}
Code 0-2: SchreibenA.java in Projekt 003_semaphore
public class LesenC extends Thread
{
public void run()
{
while(true)
{
Hauptprogramm.semaphore.anfordern((Thread)this);
System.out.println("C liest nun arrA aus:");
for(int i=0;i<30;i++)
{
System.out.print(Hauptprogramm.arrA[i]);
Hauptprogramm.pausieren(100);
}
System.out.println();
Hauptprogramm.semaphore.freigeben();
//Erledige andere Aufgaben:
Hauptprogramm.pausieren(200);
}
}
}
Code 0-3: LesenC.java in Projekt 003_semaphore
public class Hauptprogramm
{
public static Semaphore semaphore = new Semaphore();
public static int[] arrA={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
public static int[] arrB={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
public static void pausieren(long ms)
{
try
{
Thread.sleep(ms);
}
catch(Exception e)
{
}
}
public static void main(String[] args)
{
semaphore.init(1);
SchreibenA schreibenA = new SchreibenA();
LesenC lesenC = new LesenC();
schreibenA.start();
lesenC.start();
pausieren(20000);
while(lesenC==Thread.currentThread());
lesenC.stop();
while(schreibenA==Thread.currentThread());
schreibenA.stop();
}
}
Code 0-4: Hauptprogramm.java in Projekt 003_semaphore
A schreibt. A fertig. C liest nun arrA aus: 000000000000000000000000000000 A schreibt. A fertig. C liest nun arrA aus: 111111111111111111111111111111 A schreibt. A fertig. C liest nun arrA aus: 000000000000000000000000000000 A schreibt. A fertig. C liest nun arrA aus: 111111111111111111111111111111 A schreibt. A fertig. C liest nun arrA aus: 000000000000000000000000000000
Code 0-5: Konsolenausgabe
|
Übung
|
Aufgaben
|