Darstellung des Synchronisierungsvorgangs von Lese- und Schreibprozessen mit Java
java_semaphor.zip - Download der nachfolgenden Java-Projekte.
  | 
public class SchreibenA extends Thread
{
    public boolean einser = false;
    public void run()
    {
        while(true)
        {
            for(int i=0;i<30;i++)
            {
                if(einser)
                    Hauptprogramm.arrA[i]=1;
                else
                    Hauptprogramm.arrA[i]=0;
                Hauptprogramm.pausieren(20);
            }
            //Erledige andere Aufgaben:
            Hauptprogramm.pausieren(50);
            einser = !einser;
        }
    }
}
Code 0-1: SchreibenA.java in Projekt 001_unkontrolliert
public class SchreibenB extends Thread
{
    public boolean einser = false;
    public void run()
    {
        while(true)
        {
            for(int i=0;i<30;i++)
            {
                if(einser)
                    Hauptprogramm.arrB[i]=1;
                else
                    Hauptprogramm.arrB[i]=0;
                Hauptprogramm.pausieren(20);
            }
            //Erledige andere Aufgaben:
            Hauptprogramm.pausieren(50);
            einser = !einser;
        }
    }
}
Code 0-2: SchreibenB.java in Projekt 001_unkontrolliert
public class LesenC extends Thread
{
    public void run()
    {
        while(true)
        {
            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();
            System.out.println("C  liest nun arrB aus:");
            for(int i=0;i<30;i++)
            {
                System.out.print(Hauptprogramm.arrB[i]);
                Hauptprogramm.pausieren(100);
            }
            System.out.println();
            //Erledige andere Aufgaben:
            Hauptprogramm.pausieren(200);
        }
    }
}
Code 0-3: LesenC.java in Projekt 001_unkontrolliert
public class Hauptprogramm
{
    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)
    {
        SchreibenA schreibenA = new SchreibenA();
        SchreibenB schreibenB = new SchreibenB();
        LesenC lesenC = new LesenC();
        schreibenA.start();
        schreibenB.start();
        lesenC.start();
        pausieren(20000);
        while(lesenC==Thread.currentThread());        
        lesenC.stop();
        while(schreibenB==Thread.currentThread());        
        schreibenB.stop();
        while(schreibenA==Thread.currentThread());        
        schreibenA.stop();
    }
}
Code 0-4: Hauptprogramm.java in Projekt 001_unkontrolliert
  | 
C liest nun arrA aus: 000000000111111110000000011111 C liest nun arrB aus: 000011111111000000001111111100 C liest nun arrA aus: 111110000000011111111000000001 C liest nun arrB aus: 000000001111111100000000111111 C liest nun arrA aus: 011111111000000001111111100000 C liest nun arrB aus: 111100000000111111110000000011
Code 0-5: Konsolenausgabe
  | 
  | 
public class SchreibenA extends Thread
{
    public boolean einser = false;
    public void run()
    {
        while(true)
        {
          if(Hauptprogramm.CliestA==false)
          {
            Hauptprogramm.Aschreibt=true;
            for(int i=0;i<30;i++)
            {
                if(einser)
                    Hauptprogramm.arrA[i]=1;
                else
                    Hauptprogramm.arrA[i]=0;
                Hauptprogramm.pausieren(20);
            }
            Hauptprogramm.Aschreibt=false;
            einser = !einser;
          } 
          //Erledige andere Aufgaben:
          Hauptprogramm.pausieren(50);
        }
    }
}
Code 0-6: SchreibenA.java in Projekt 002_kontrolliert
public class SchreibenB extends Thread
{
    public boolean einser = false;
    public void run()
    {
        while(true)
        {
          if(Hauptprogramm.CliestB==false)
          {
            Hauptprogramm.Bschreibt=true;
            for(int i=0;i<30;i++)
            {
                if(einser)
                    Hauptprogramm.arrB[i]=1;
                else
                    Hauptprogramm.arrB[i]=0;
                Hauptprogramm.pausieren(20);
            }
            Hauptprogramm.Bschreibt=false;
            einser = !einser;
          } 
          //Erledige andere Aufgaben:
          Hauptprogramm.pausieren(50);
        }
    }
}
Code 0-7: SchreibenB.java in Projekt 002_kontrolliert
public class LesenC extends Thread
{
    public void run()
    {
        while(true)
        {
          if(Hauptprogramm.Aschreibt==false)
          {
            Hauptprogramm.CliestA=true;
            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.CliestA=false;
          }
          if(Hauptprogramm.Bschreibt==false)
          {
            Hauptprogramm.CliestB=true;
            System.out.println("C  liest nun arrB aus:");
            for(int i=0;i<30;i++)
            {
                System.out.print(Hauptprogramm.arrB[i]);
                Hauptprogramm.pausieren(100);
            }
            System.out.println();
            Hauptprogramm.CliestB=false;
          }
          //Erledige andere Aufgaben:
          Hauptprogramm.pausieren(200);
        }
    }
}
Code 0-8: LesenC.java in Projekt 002_kontrolliert
public class Hauptprogramm
{
    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 boolean Aschreibt = false;
    public static boolean Bschreibt = false;
    public static boolean CliestA   = false;
    public static boolean CliestB   = false;
    public static void pausieren(long ms)
    {
        try
        {
            Thread.sleep(ms);
        }
        catch(Exception e)
        {
        }
    }
    public static void main(String[] args)
    {
        SchreibenA schreibenA = new SchreibenA();
        SchreibenB schreibenB = new SchreibenB();
        LesenC lesenC = new LesenC();
        schreibenA.start();
        schreibenB.start();
        lesenC.start();
        pausieren(30000);
        while(lesenC==Thread.currentThread());        
        lesenC.stop();
        while(schreibenB==Thread.currentThread());        
        schreibenB.stop();
        while(schreibenA==Thread.currentThread());        
        schreibenA.stop();
    }
}
Code 0-9: Hauptprogramm.java in Projekt 001_unkontrolliert
C liest nun arrA aus: 111111111111111111111111111111 C liest nun arrB aus: 111111111111111111111111111111 C liest nun arrA aus: 000000000000000000000000000000 C liest nun arrB aus: 000000000000000000000000000000
Code 0-10: Konsolenausgabe
  |